Español
Fuente/ Codesnippets

Nichtlineare Gleichungssysteme lösen: Newton-Kantorowitsch Algorithmus

 

p.specht

Referencia: Das Nichtlineare Gleichungssystem ("NGS") muß uno aquí en el Sourcecode einprogrammieren (Un Eingabe sólo während des Programmlaufes wäre sólo en el Interpreter con vertretbarem Aufwand - Stichwort Execute-Befehl - posible).

Lo es son el Erweiterung des bekannten Newton-Raphson-Algorithmus en mehrere simultane Gleichungen.
Windowtitle "Newton-Kantorowitsch-Verfahren a Solución nichtlinearer Gleichungssysteme"
'{ (pD) private Demoware, 2013-03 de VB después de XProfan 11.2 by P. Pájaro carpintero
' Keine Gewähr! Original-Source: https://www.rhirte.de/vb/nlgleisys.htm
' ********************************************************************************************
' Kurzversion el Original-Erläuterung de Prof. Hirthe:
' Das Newtonverfahren a Bestimmung uno Solución (Nullstelle) kann para Systeme nichtlinearer
' Gleichungen verallgemeinert voluntad, indem uno se anstelle el individual Funktionswerte
' Vektoren vorstellt. Statt el de Newton verwendeten 1. Ableitung el Función necesario entonces
' aber vollständige partielle Ableitungen, zusammengefasst en el sog.  "Jacobi-Matrix" J[]
' o. el "Jacobi'schen Determinante" verwendet voluntad. Vorausgesetzt para n Variables posición
' n Bedingungsgleichungen disponible, se el Solución entonces en allen n Dimensionen des
' Vektors gleichzeitig gesucht.
' Como uno una Vektor no por una Matrix dividieren kann, muß en lugar de dessen con ihrer
' Inversen multipliziert voluntad. Sei p[] el Vektor el x-Werte, F[] el Vektor el
' Características, entonces gilt bastante analog a einfachen Newton-Formel el Iterationsformel:
' ********************************************************************************************
' *  p_next[1..n] = p[1..n] - J * (p[1..n])^-1 * F[p[1..n],1..n]
' ********************************************************************************************
' Wegen des Zeitaufwandes mag niemand el siempre neuen Inversen berechnen,
' por qué uno esta en el Praxis sólo de y a neu berechnet - el va sí en el einfachen
' Newtonverfahren con el Ableitung auch (= temporärer Rückgriff en regula falsi):
' Wenn uno el Differenz de p y p_next el Namen "Verbesserungsvektor u[]" son y
' el Formel alles de links con J[] multipliziert, así ergibt J*J^-1 una Einheitsmatrix, el
' uno weglassen kann. Man erhält: Ein LINEARES Gleichungssystem en vektorieller Schreibweise!
'   J[ <delta(F[p[i]])/delta(x[j=1..n])>, x[j=1..n] ] * u[i=1..n] = -1 * F[ p[<x_[i=1..n]>] ]
' ********************************************************************************************
' Se puede nichtlineare Problemas also linearisieren: u[] stabilisiert se en Nähe el Solución!
' ********************************************************************************************
' Anmerkung: "Ableitung" es como numerische Ableitung programmiert, porque uno así unabhängig
' vom konkreten Funktionensatz es, dessen Solución gefunden voluntad se. Anders "Gleichungen",
' hier posición el veränderlichen Gleichungen, el uno desafortunadamente sólo bajo großen Schwierigkeiten
' a Laufzeit des Programmes eintragen podría.
'
' Für el Lineare Solución se entonces una übliches Gauss-Jordan- oder Gauss-Seidel-Verfahren benutzt.
'}  u[] es stabil, si la Diferencia z.B. kleiner eps = 1E-9 beträgt.
'{ Deklarationen, Initialisierung
' para el Iteration x_next[]=J*x[]
Font 2:set("decimals",15):randomize:cls rnd(8^8):window 0,0-%maxx,480
Declarar n&,i&,j&,x$[],Runde&,eps!,summe!
Init:
x$[]=explode("0.1,0.1,0.1",",")
n&=sizeof(x$[]):declarar B![n&,n&+1],x![n&],u![n&]

whileloop n&:x![&Loop]=val(x$[&Loop-1]):endwhile :clear x$[]

    eps!=10^-9
    '}
    '{ Hauptteil con Linearisierung y numerischer Berechnung el Jacobi-Matrix
    Runde&=0

    Repeat

        whileloop n&:i&=&Loop:whileloop n&:j&=&Loop

            B![i&,j&]=Ableitung(n&,i&,j&,x![]):endwhile
            B![i&,n&+1]= -1*Gleichung(i&,x![]):endwhile' Eines el linearen Gauß-...-Verfahren
            GaussPivotElimination n&,B![],u![]
            Summe!=0

            whileloop n&:i&=&Loop:x![i&]=u![i&]+x![i&]:Summe!=Summe!+Abs(u![i&]):endwhile :inc Runde&

            Until (Summe!<eps!) O (Runde&>=2000)' Loesung_ausgeben

            Case Runde&>=2000:Imprimir "Auch después de 2000 Iterationen kein stabiles Ergebnis!"

            Whileloop n&:i&=&Loop:imprimir "x"+str$(i&);" = ";format$("%g",x![i&]):endwhile

                Waitinput
                '}
                End

                Proc Gleichung :Parámetros num&,x![]' El n& Gleichungen hier eingeben:

                    Declarar g!' ACHTUNG: Sqr = Quadrat (Wurzel wäre sqrt()!)

                    Select num&' Probe: El Musterlösung muss x[1]=1, x[2]=-2, x[3]=4 ergeben!

                        Caseof 1

                        g!=3*x![1]+4*sqr(x![2])-6*x![3]+5

                        Caseof 2

                        g!=sqr(x![1])-3*x![2]+5*x![3]-27

                        Caseof 3

                        g!= -5*x![1]+x![2]+sqr(x![3])- 9
                        Otherwise
                        Imprimir " Error: Un Gleichung ";num&,"gibt no!":waitinput :waitinput :end

                    EndSelect

                    ' imprimir num&,x![1],x![2],x![3],g! ' DEBUG Line
                    Volver g!

                ENDPROC

                Proc Ableitung :Parámetros n&,Gleinum&,Varnum&,xv![]

                    Declarar dx!,y1!,y2!,dxv![10],i&

                    Whileloop n&:i&=&Loop

                        dxv![i&] = xv![i&]

                    Endwhile

                    y1! = Gleichung(Gleinum&,xv![])
                    dx! = eps! * xv![Varnum&]
                    Case dx!=0:dx!=eps!
                    dxv![Varnum&] = dxv![Varnum&] + dx!
                    y2!=Gleichung(Gleinum&,dxv![])
                    Volver (y2!-y1!)/dx!

                ENDPROC

                Proc GaussPivotElimination :Parámetros n%,a![],x![]'Eines el hier möglichen Gauss-...-Verfahren

                    ' a![n%,(n%+1)] ' LGS-Zeilen*(Spalten+1) ca.Lösungsvektor "Rechte Seite"
                    declarar i%,j%,k%,jmax%,kmax!,kmax%,merk%[n%],s!,max!,skal![n%]

                    WhileLoop n%:i%=&Loop:merk%[i%]=i%:EndWhile

                        WhileLoop n%:i%=&Loop:s!=0

                            WhileLoop n%:j%=&Loop:s!=s!+Abs(A![i%,j%]):EndWhile :skal![i%]=1/s!

                            EndWhile

                            WhileLoop n%-1:k%=&Loop:max!=skal![k%]*Abs(A![k%,k%]):kmax%=k%:jmax%=k%

                                WhileLoop k%,n%:j%=&Loop

                                    WhileLoop k%,n%:i%=&Loop

                                        If (skal![j%]*Abs(A![j%,i%]))>max!

                                            jmax%=j%:kmax%=i%:max!=skal![j%]*Abs(A![j%,i%])

                                        EndIf

                                    EndWhile

                                EndWhile

                                If jmax%<>k%

                                    WhileLoop k%,n%+1:j%=&Loop:s!=A![k%,j%]:A![k%,j%]=A![jmax%,j%]:A![jmax%,j%]=s!

                                        EndWhile :s!=skal![k%]:skal![k%]=skal![jmax%]:skal![jmax%] = s!

                                    EndIf

                                    If kmax% <> k%

                                        WhileLoop n%:i%=&Loop:s!=A![i%,k%]:A![i%,k%]=A![i%,kmax%]:A![i%,kmax%]=s!

                                            EndWhile :j% = merk%[k%]:merk%[k%]=merk%[kmax%]:merk%[kmax%]=j%

                                        EndIf

                                        WhileLoop k%+1,n%:i%=&Loop:s!=A![i%,k%]/A![k%,k%]:A![i%,k%]=0

                                            WhileLoop k%+1,n%+1:j%=&Loop:A![i%,j%]=A![i%,j%]-s!*A![k%,j%]:EndWhile

                                            EndWhile

                                        EndWhile

                                        x![merk%[n%]]=A![n%,n%+1]/A![n%,n%]

                                        WhileLoop n%-1,1,-1:i%=&Loop:s! = A![i%,n%+1]

                                            WhileLoop i%+1,n%:j%=&Loop:s!=s!-A![i%,j%]*x![merk%[j%]]:EndWhile

                                                x![merk%[i%]]=s!/A![i%,i%]

                                            EndWhile

                                            volver x![]

                                        ENDPROC

 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
30.04.2021  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

592 Views

Untitledvor 0 min.
Ernst21.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
R.Schneider28.05.2021
Thomas Zielinski10.05.2021
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie