求非线性方程的根(二分法.定点迭代法.顿法)
下面是自己写的几个求非线性方程的根(matlab描述)方法:
以y=x.^2-3*x+2-exp(x)为例
1)二分法(文件名:ErFen.m)
a)function[R]=ErFen(f,a,b,e1,n)
% 二分法求根算法实验2
% f 要求根函数名
% a 初试有根区间最小值
% b 初试有根区间最大值
% e 精度
% n 跌代次数
k=0;
fb=feval_r(f,b);
fa=feval_r(f,a);
x=(a+b)/2;
fx=feval_r(f,x);
while
abs(a-b)>e1&k
k=k+1;
disp([k,x,fx,abs(a-b)]); %显示跌代过程
if fx*fa<0
b=x;
fb=fx;
else
a=x;
fa=fx;
end
x=(a+b)/2;
fx=feval_r(f,x);
end
R=x;
b)
二分法、牛顿法所需用的原函数(文件名Myfun.m:)
function[y]=myfun(x)
y=x.^2-3*x+2-exp(x)
2)定点迭代法(文件名:DieDai.m)
a) function [R]=DieDai(g,x1,N,e)
% 定点迭代法
% g 要求根函数名
% x1 迭代初值
% N 迭代最大次数
% e 精度
k=0;
x2=feval_r(g,x1);
while abs(x2-x1)>e&k
k=k+1;
disp([k,x1,x2,abs(x1-x2)]); 显示跌代过程%
x1=x2;
x2=feval_r(g,x1);
end
R=x2;
if k==N
error('error');% 所需迭代已达到
end
b) 实现定点迭代法所需用的函数(文件名:myfun1.m)
function[y]=myfun1(x)
% 要求的函数方程
y=(x.^2+2-exp(x))/3
3)牛顿法(文件名:Newton.m)
a)function [R]=newton(g,dg,x0,n,e)
% 牛顿法
% g 要求根函数名
% dg 要求根函数的导函数名
% x0 初值
% e 精度
% n 跌代次数
x1=x0- feval_r(g,x0)/feval_r(dg,x0);
k=0;
while ke;
k=k+1;
if feval_r(dg,x0)==0
error(error);%导函数为0程序停止
else
disp([k,x1,x0,abs(x1-x0)]);% 显示跌代过程
x0=x1;
x1=x0-
feval_r(g,x0)/feval_r(dg,x0);
end
end
end
b) 牛顿法所需用的原函数的导函数( 文件名:Dmyfun.m)
function[y]=dmyfun(x)
y=2*x-3-exp(x);
太很简单,是吧!
高人看到勿笑话,多指教!
如有错误,多谢指正!