Как использовать метод Ньютона с заданным интервалом - PullRequest
1 голос
/ 10 ноября 2019

Я могу вычислить корень функции, используя метод Ньютона, вычитая старое значение x из нового и проверяя критерий сходимости. Есть ли способ сделать это, когда задан закрытый интервал, например,

При заданной функции и интервале [a, b] = [0,1, 3,0] критерий сходимости будет рассчитан путем проверки, если [3.0 -0,1] <0,000001, т. Е. [Ba] <0,000001. </p>

Приведенный мною код рассчитывает критерий сходимости с использованием значений x. Я пытаюсь выяснить, есть ли способ, которым я могу использовать интервал вместо значений х.

from math import *

x = 1.0 #initial value

for j in range(1, 101):
    xnew = (x**2 + cos(x)**2 -4*x)/(2*(x - cos(x)*sin(x) -2))

    if abs(xnew - x) < 0.000001:
        break
    x = xnew

print('Root = %0.6f ' % xnew)
print('Number of iterations = %d' % j)

1 Ответ

1 голос
/ 10 ноября 2019

Похоже, вы хотите гарантировать, что корень найден в заданном интервале (что не может гарантировать Ньютон-Рафсон). Вы можете использовать пополам для этого. Если вы знаете, что функция меняет знак в заданном интервале (и непрерывно в одном и том же), то работает что-то вроде следующего:

>>> from sympy.abc import x
>>> from sympy import nsolve
>>> ivl = 0,3
>>> expr = (x**2 + cos(x)**2 -4*x)
>>> nsolve(expr, x, ivl)
0.250324492526265

Но, похоже, вы можете смешать некоторые переменные в том, что выпытаются с помощью метода NR. xnew, который вы рассчитываете, очень похож на f(x)/f'(x), который равен dx в xnew = x - dx. Поэтому, если вы напишите:

for j in range(1, 101):
  dx = (x**2 + cos(x)**2 -4*x)/(2*(x - cos(x)*sin(x) -2))
  if abs(dx) < 0.000001:
    break
  x = x - dx

print('Root = %0.6f ' % x)
print('Number of iterations = %d' % j)

, вы получите

Root = 0.250324 
Number of iterations = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...