Python-nichtlineare Gleichungslösung Dichotomie & Newton-Rahson-Methode

Finden Sie die numerische Lösung der folgenden nichtlinearen Gleichung unter Verwendung der Dichotomie und der Newtonschen Methode.

sin(x)=0

Dichotomie

Wenn $ f (x) $ stetig ist und $ f (a) f (b) <0 $ im Intervall $ x = [a, b] $ ist, ist die Lösung, dass $ f (x) = 0 $ im Intervall Wie man einen findet.

Der Algorithmus ist

  1. Ersetzen Sie die Anfangswerte für $ a_0 und b_0 $ innerhalb des Bereichs, in dem Sie eine Lösung finden möchten, die $ f (a_0) f (b_0) <0 $ erfüllt.
  2. $ c = \ frac {(a_i + b_i)} {2} $, und wenn $ f (c) f (a_i) <0 $, dann ist $ b_ {i + 1} = c, a_ {i + 1} Wenn = a_i $ und $ f (c) f (a_i)> 0 $, aktualisieren Sie mit $ b_ {i + 1} = b_i, a_ {i + 1} = c . 3.Führen Sie 2 aufeinanderfolgende Berechnungen durch und|f(c)|<ε_1$Oder|a_i-b_i|<ε_2Wenn dies erfüllt ist, wird die Berechnung so beendet, als ob sie konvergiert hätte.

·Quellcode

Um die Lösung von $ x = π $ zu finden, wurden die Anfangswerte auf $ a_0 = 3.0 $ und $ b_0 = 3.5 $ gesetzt.

import math

def f(x):
    return math.sin(x)

EPS1 = 0.00001
EPS2 = 0.00001

a = 3.0
b = 3.5

while True:
    c = (a + b)/2
    if f(a)*f(c) < 0:
        b = c
    else:
        a = c
    if abs(f(c)) < EPS1 or abs(a - b) < EPS2:
        break

print("x = %f" % c)

·Ergebnis

>>> print("x = %f" % c)
x = 3.141602

Newton-Methode

Eine Methode zum Ermitteln der Tangente von $ f (x) $ in $ x_i $, zum Aktualisieren des Schnittpunkts der Tangente und der $ x $ -Achse als nächste $ x_ {i + 1} $ und zum Durchführen sequentieller Berechnungen.

Die Tangente $ g (x) $ von $ f (x) $ in $ x_i $ ist

g(x)-f(x_i)=f^{'}(x_i)(x-x_i)

Setzen Sie $ g (x) = 0 $, um den Schnittpunkt der Tangente und der $ x $ -Achse als nächstes $ x_ {i + 1} $ zu aktualisieren

0-f(x_i) = f^{'}(x_i)(x_{i+1}-x_i)\\
x_{i+1} = x_i-\frac{f(x_i)}{f^{'}(x_i)} ... ①

Der Algorithmus ist

  1. Geben Sie $ x_0 $ einen Anfangswert.
  2. Finden Sie das folgende $ x_ {i + 1} $ gemäß der Formel ①. 3.Wiederholen Sie 2$|f(x)|<ε$Wenn es wird, wird angenommen, dass es konvergiert hat und endet.

·Quellcode

Diesmal wurde die analytische Lösung ($ cos (x) $) als Differenzwert verwendet.

import math

def f(x):
    return math.sin(x)

def df(x):
    return math.cos(x)

EPS1 = 0.0001

x = 3.5

while True:
    x -= f(x)/df(x)
    if abs(f(x)) < EPS1:
        break
        
print("x = %f" % x)

·Ergebnis

>>> print("x = %f" % x)
x = 3.141594

Recommended Posts

Python-nichtlineare Gleichungslösung Dichotomie & Newton-Rahson-Methode
Python - Differentialgleichung Numerische Lösung Euler-Methode & Zentrale Differenzmethode & Rungekutta-Methode