一、区间二分法
例如用区间二分法求方程x5+3x-1=0的最小正根,要求误差不超过1/2×10-2
function x =Bisection()
%区间二分法
s=input('请输入函数表达式:f = ','s');
f=inline(s);
a = input('请输入区间左端点:a=');
b = input('请输入区间右端点:b=');
eps=input('请输入停止精度要求:eps=');
while(f(a)*f(b)>0)
a = input('请再次输入区间左端点:a=');
b = input('请再次输入区间右端点:b=');
end
if(f(a)==0)
x=a;
elseif(f(b)==0)
x=b;
else
x=(a+b)/2.0;
while(abs(b-x)>eps)
if(f(a)*f(x)<0)
b=x;
x=(a+b)/2.0;
elseif(f(b)*f(x)<0)
a=x;
x=(a+b)/2.0;
else
break;
end
end
end
fprintf('结果为: ');
end
结果截图:
二、牛顿迭代法
用迭代法解非线性方程4x3+x-1=0 ,要求精度达到10-3(初值取0.6)
syms x;%定义符号常量
f=input('请输入函数表达式:f=');
Xo=input('请输入初值:');
eps=input('请输入精度:');
ff=diff(f);%diff求一阶偏导数
if(subs(ff,'x',Xo)~=0) %subs函数是将Xo的值代替ff中x,并计算出结果
X1=Xo-subs(f,'x',Xo)/subs(ff,'x',Xo);
while(abs(X1-Xo)>eps)%abs函数是求绝对值
Xo=X1;
if(subs(ff,'x',Xo)~=0)
X1=Xo-subs(f,'x',Xo)/subs(ff,'x',Xo);
end
if(X1>10^10)
fprintf('函数发散');
break;
end
end
fprintf('结果为:%f',X1);
end
本题是牛顿迭代法实现的,牛顿迭代法的公式如下:
这个题呢,我当时写了很久,因为按照思路去写总是会报错,然后发现要定义符号常量才能进行后面的操作,但是迭代计算的时候又发现压根算不出来,去网上找了很多发现要用subs函数才好实现符号常量的计算,想要了解subs函数具体用法的可以自行去搜索。
结果截图: