数值分析中求解非线性方程的MATLAB求解程序(6种)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析中求解非线性方程的MATLAB求解程序(6种)
1.求解不动点
function [k,p,err,P]=fixpt(g,p0,tol,max1)
%求解方程x=g(x) 的近似值,初始值为p0
%迭代式为Pn+1=g(Pn)
%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率
P(1)=p0;
for k=2:max1
P(k)=feval(g,P(k-1));
err=abs(P(k)-P(k-1));
relerr=err/(abs(P(k))+eps);
p=P(k);
if (err<tol)|(relerr<tol)
break;
end
end
if k==max1
disp('超过了最长的迭代次数')
end
P=P';
2.二分法
function [c,err,yc]=bisect(f,a,b,delta)
%二分法求解非线性方程
ya=feval(f,a);
yb=feval(f,b);
if ya*yb>0
break;
end
max1=1+round((log(b-a)-log(delta))/log(2));
for k=1:max1
c=(a+b)/2;
yc=feval(f,c);
if yc==0
a=c;
b=c;
elseif yb*yc>0
b=c;
yb=yc;
else
a=c;
ya=yc;
end
if b-a<delta
break;
end
end
c=(a+b)/2;
err=abs(b-a);
yc=feval(f,c);
3.试值法
function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程
%f(a)和飞(b)异号
ya=feval(f,a);
yb=feval(f,b);
if ya*yb>0
disp('Note:f(a)*f(b)>0');
end
for k=1:max1
dx=yb*(b-a)/(yb-ya);
c=b-dx;
ac=c-a;
yc=feval(f,c);
if yc==0
break;
elseif yb*yc>0
b=c;
yb=yc;
else
a=c;
ya=yc;
end
dx=min(abs(dx),ac);
if abs(dx)<delta|abs(yc)<epsilon
break;
end
end
c;
err=abs(b-a)/2;
yc=feval(f,c);
4.求解非线性方程根的近似位置
function R=approot(X,epsilon)
%求解根近似位置
%为了粗估算方程f(x)=0在区间[a,b]的根的位置,
%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,
%或者|f(xk)|足够小且曲线y=f(x)的斜率在
%(xk,f(xk))附近改变符号。

Y=f(X);
yrange=max(Y)-min(Y);
epsilon2=yrange*epsilon;
n=length(X);
m=0;
X(n+1)=X(n);
Y(n+1)=Y(n);
for k=2:n
if Y(k-1)*Y(k)<0
m=m+1;
R(m)=(X(k-1)+X(k))/2;
end
s=(Y(k)-Y(k-1))*(Y(k+1)-Y(k));
if (abs(Y(k))<epsilon2)&(s<=0)
m=m+1;
R(m)=X(k);
end
end
5.牛顿—拉夫森迭代
function [p0,err,k,y]=newton(f,df,p0,delta,epsilon,max1) %牛顿—拉夫森迭代求解非线性方程
%df需要自己f手动求得
%p0为迭代初始值,max1为最大迭代次数
for k=1:max1
p1=p0-feval(f,p0)/feval(df,p0);
err=abs(p1-p0);
relerr=2*err/(abs(p1)+delta);
p0=p1;
y=feval(f,p0);
if(err<delta)|(relerr<delta)|(abs(y)<epsilon)
break
end
end
6.割线法
function [p1,err,k,y]=secant(f,p0,p1,delta,epsilon,max1) %割线法迭代求解非线性方程
for k=1:max1
p2=p1-feval(f,p1)*(p1-p0)/(feval(f,p1)-feval(f,p0));
err=abs(p2-p1);
relerr=2*err/(abs(p2)+delta);
p0=p1;
p1=p2;
y=feval(f,p1);
if (err<delta)|(relerr<delta)|(abs(y)<epsilon) break;
end
end。

相关文档
最新文档