对于二分法的matlab代码:
myfunction.m
function y=myfunction(x)
y=x^6-x-1;
end
dichotomyRoot.m
function y=dichotomyRoot(x1,x2,e)
x=(x1+x2)/2; % x是中间数
f3=myfunction(x);
f1=myfunction(x1);
if f1*f3<0
%k=k+1;
m=x-x1; % m是距离
fprintf('%.4f\t%.4f\t%.4f\t%.4f\n',x1,x2,x,myfunction(x));
if m>e
x2=x;
y=dichotomyRoot(x1,x2,e);
else
y=x;
end
else
%k=k+1;
m=x2-x;
fprintf('%.4f\t%.4f\t%.4f\t%.4f\n',x1,x2,x,myfunction(x));
if m>e
x1=x;
y=dichotomyRoot(x1,x2,e);
else
y=x;
% fprintf('%.4f\t%.4f\t%.4f\t%.4f\n',x1,x2,x,myfunction(x));
end
end
end
dichotomy.m
function dichotomy()
x1=input('输入求根区间的下限,x1=');
x2=input('输入求根区间的上限,x2=');
e=input('输入求根的精度,e=');
fprintf('ak\t\tbk\t\txk\t\tf(x)\n');
f1=myfunction(x1);
f2=myfunction(x2);
if f1*f2>0
disp('根不在输入的区间里');
else
y=dichotomyRoot(x1,x2,e);
%disp('root=');
fprintf('%.6f',y);
end
end
程序结果:
二、对于迭代法:
diedai.m
function [k, piancha xk]=deidai1(x0,k)
%输入的量 ,x0是初始值,k是迭代的次数
x(1)=x0;
for i=1:k
x(i+1)=fun1(x(i))%程序调用的是fun1.m为函数y=f'(x)
piancha=abs(x(i+1)-x(i));
fprintf('迭代第%d次\n',i);
i=i+1;
xk=x(i);
[i-1 piancha xk]
end;
if (piancha>0.0005)&(k>3)
disp('请用户注意:此迭代序列发散,请重新输入新的迭代公式');
return ;
end
if (piancha<0.0005)&(k>3)
disp('此程序迭代收敛,且收敛速度越来越快!')
return ;
end
%p=[(i-1) piancha xk]';
end
fun1.m
function y1=fun1(x)
y1=sin(x)+0.5;
end
程序结果:
牛顿法:
Newton_1.m
function Newton(fyuan,fdao,x,e)
% 原函数 一阶导数 初始值 精确范围
k=1;
y=x-feval(fyuan,x)/feval(fdao,x);
while (k<=100)&&(abs(x-y)>e)
x =y;
fprintf('第%d次迭代结果为:%.6f\n',k,y);
y=x-feval(fyuan,x)/feval(fdao,x);
k=k+1;
end
Newtonans.m
fun = @(x) x.^6-x-1;
dfun = @(x) 6*x.^5-1;
fprintf('牛顿法实验结果(正常精确度):\n');
Newton(fun,dfun,1,0.0005)
fprintf('缩小精确度后:\n')
Newton(fun,dfun,1,0.0000000001)
程序结果如图:
实验总结:
通过实验结果表明:对二分法和牛顿法而言,相同的非线性函数下求根,用二分法迭代的次数k更大,结果更为精确;牛顿法迭代的次数少,但是不精确。如果改变牛顿法的精确范围变得小一点,则牛顿法结果变得精确,迭代次数还是小于二分法。