0

Я пытаюсь найти метод Newton-Raphson для поиска корней. Он делает это, делая предположение, а затем улучшая предположение после каждой итерации, пока не получите один из нулей.Ошибка цикла с методом Netwon-Raphson

Поскольку метод Ньютона-Рафсона быстро находит нули, он дает мне небольшую ошибку немедленно и после двух или трех итераций max он не должен удовлетворять условиям цикла while. Однако проблема заключается в том, что когда я удаляю полуточку после «ошибки» в моем цикле, я начинаю получать дроби, которые должны разорвать цикл while, но его, как Matlab, не знает, что 123/8328423 меньше 1. Он продолжает работать до тех пор, пока я вручную не заставлю программу прекратить работу.

Как исправить это? Я пробовал формат long, формат longe и использовал double в командном окне, в файле scrip и где-то в цикле.

Благодарим вас за любые советы, предложения или советы, которые могут помочь!

A = [1,2,-4;2,-2,-2;-4,-2,1;]; 
format longe 
% syms x y z 
% P = x^4 + 3*x^2*y^2-z^3+y+1; 
% feval(symengine,'degree',P,x) 

syms x 

B = mateigenvalue(A); 
f(x) = simplify(matdet(B)); 

x0 = 1; 
error = 10; 
while(error > .01) 
    x1 = x0 - f(x0)/(27*(x0)-3*(x0)^2); 
    error = abs(((f(x0)-f(x1))/f(x0))*100) 
    x0 = x1; 
end 

x0 = double(x0) 

ответ

2

Я считаю, главная проблема с error.
Он начинается с double, но внутри цикла while он превращается в символическую переменную, и вы не можете легко сравнить символические переменные со скалярными значениями (.01 в состоянии while-loop).

Проверьте свое рабочее пространство, если error является символическим (или введите class(error) и проверьте, возвращается ли sym). Я думаю, это символично, потому что возвращается часть (123/8328423), так как вместо Matlab рассматриваются двойные значения с десятичными знаками, а не с дробями.
Если да, то попробуйте сделать (внутри While-цикле) преобразования для error, который, по линии

error = abs(((f(x0)-f(x1))/f(x0))*100); 

попробовать положить

error=double(error); 

Так error будет временно переоборудованы в double и вы может легко сравнить его значение с .01, чтобы проверить условие while-loop.

Кроме того, это плохая практика, чтобы вызвать переменную error, так как error() - это встроенная функция в Matlab. Выбирая переменную error, вы не можете использовать функцию error(). Та же история идет о других встроенных функциях.

 Смежные вопросы

  • Нет связанных вопросов^_^