《计算方法》有一题使用牛顿迭代求解方程实根的题目。
查阅资料,发现判断方程有几个实根的方法太复杂,为了有效求出方程的实根,可以每次使用牛顿迭代求出一个根"p"后,将原方程除以“(x-p)”,然后在使用牛顿迭代进行求解。
在迭代过程中,为考虑可能会发散的情况,但是结果感人。
% 这是一个一元四次方程组,最多的实数解为4个;
% 输入初始值p0、最大迭代次数N;、
% 输出四个解的值;
% 认为迭代次数达到最大迭代次数的解可能为无效解;
% 最后的结果是输出两个解0.23235和-0.03584有效。
% 可以采用循环迭代的方法,循环四次求出四个解,有时间可以改进。
p0=0.5;
N=100;
syms x
f(x)=600*x^4-550*x^3+200*x^2-20*x-1;
df(x)=diff(f(x),1);
x0=roots([600,-550,200,-20,-1])
%求第一个解
for i=1:N
p1=p0-f(p0)/df(p0);
if abs(p0-p1)<10^(-4)
break
end
p0=p1;
end
disp('第1个解')
disp(vpa(p1,5))
if i==N
disp('此解可能无效')
end
%求第二个解
p=vpa(p1,5);
f(x)=f(x)/(x-p);
df(x)=diff(f(x),1);
p0=1;
for i=1:N
p1=p0-f(p0)/df(p0);
if abs(p0-p1)<10^(-4)
break
end
p0=p1;
end
disp('第2个解')
disp(vpa(p1,5))
if i==N
disp('此解可能无效')
end
%求第三个解
p=vpa(p1,5);
f(x)=f(x)/(x-p);
df(x)=diff(f(x),1);
p0=1;
for i=1:N
p1=p0-f(p0)/df(p0);
if abs(p0-p1)<10^(-4)
break
end
p0=p1;
end
disp('第3个解')
disp(vpa(p1,5))
if i==N
disp('此解可能无效')
end
%求第四个解
p=vpa(p1,5);
f(x)=f(x)/(x-p);
df(x)=diff(f(x),1);
p0=1;
for i=1:N
p1=p0-f(p0)/df(p0);
if abs(p0-p1)<10^(-4)
break
end
p0=p1;
end
disp('第4个解')
disp(vpa(p1,5))
if i==N
disp('此解可能无效')
end