Équation Python-non linéaire résolvant la dichotomie et la méthode Newton-Rahson

Trouvez la solution numérique de l'équation non linéaire suivante en utilisant la dichotomie et la méthode de Newton.

sin(x)=0

Dichotomie

Lorsque $ f (x) $ est continu et $ f (a) f (b) <0 $ dans l'intervalle $ x = [a, b] $, la solution que $ f (x) = 0 $ dans l'intervalle Comment en trouver un.

L'algorithme est

  1. Remplacez les valeurs initiales de $ a_0 et b_0 $ dans la plage où vous voulez trouver une solution qui satisfait $ f (a_0) f (b_0) <0 $.
  2. $ c = \ frac {(a_i + b_i)} {2} $, et si $ f (c) f (a_i) <0 $, alors $ b_ {i + 1} = c, a_ {i + 1} Si = a_i $ et $ f (c) f (a_i)> 0 $, mettez à jour avec $ b_ {i + 1} = b_i, a_ {i + 1} = c . 3.Effectuer 2 calculs séquentiels et|f(c)|<ε_1$Ou|a_i-b_i|<ε_2Si est satisfait, le calcul se termine comme s'il avait convergé.

·Code source

Pour trouver la solution pour $ x = π $, les valeurs initiales étaient $ a_0 = 3,0 $ et $ b_0 = 3,5 $.

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)

·résultat

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

Méthode Newton

Une méthode pour trouver la ligne tangente de $ f (x) $ dans $ x_i $, mettre à jour l'intersection de la ligne tangente et de l'axe $ x $ en tant que $ x_ {i + 1} $ suivant, et effectuer un calcul séquentiel.

La tangente $ g (x) $ de $ f (x) $ dans $ x_i $ est

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

Pour mettre à jour l'intersection de la ligne tangente et de l'axe $ x $ en tant que $ x_ {i + 1} $ suivant, définissez $ g (x) = 0 $

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

L'algorithme est

  1. Donnez une valeur initiale à $ x_0 $.
  2. Trouvez les $ x_ {i + 1} $ suivants selon la formule ①. 3.Répéter 2$|f(x)|<ε$Quand il le devient, on considère qu'il a convergé et il se termine.

·Code source

Cette fois, la solution analytique ($ cos (x) $) a été utilisée comme valeur différentielle.

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)

·résultat

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

Recommended Posts

Équation Python-non linéaire résolvant la dichotomie et la méthode Newton-Rahson
Python - Solution numérique d'équation différentielle Méthode d'Euler et méthode de différence centrale et méthode Rungekutta