3.非线性方程求解 迭代法求解
首先要确定方程实数根存在的大致范围。为此,先将方程变成标准形式f(x)
x=sinx??0。作f(x)的曲线图:
3x=-2*pi:0.1:2*pi; f=sin(x)-x./3;
plot(x,f);grid on;
从曲线上可以看出,函数的零点大约在x1 ≈0和x2 ≈ 2.2附近。
3210-1-2-3-8-6-4-202468(1) 直接使用指令 fzero 求出方程在x1 ≈ 0时的根。
x1=fzero('sin(x)-x/3',0)
(2) 若键入:fzero (' in(x)-x/3',0, optimset('disp', 'iter')),将显示迭代过程。
matlab运行结果为:
21
中间数据表明,求根过程中不断缩小探测范围,最后得出0满足精度的近似根。
(3)求x2 ≈ 2.2的根:
x2=fzero (' sin(x)-x/3',2.2, optimset('disp', 'iter'))
matlab运行结果为:
中间数据表明,求根过程中不断缩小探测范围,最后得出2.2789满足精度的近似根。
二分法求解
function root=HalfInterval(f,a,b,eps) if(nargin==3) eps=1.0e-6;
22
end
f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0) root=b; end
if(f1*f2>0)
disp('两端点函数值乘积大于0!'); return; else
root=FindRoots(f,a,b,eps); end
function r=FindRoots(f,a,b,eps) f_1=subs(sym(f),findsym(sym(f)),a); f_2=subs(sym(f),findsym(sym(f)),b); mf=subs(sym(f),findsym(sym(f)),(a+b)/2); if(f_1*mf>0) t=(a+b)/2;
r=FindRoots(f,t,b,eps); else
if(f_1*mf==0) r=(a+b)/2; else
if(abs(b-a)<=eps) r=(b+3*a)/4; else
s=(a+b)/2;
r=FindRoots(f,a,s,eps); end end end
主函数
matlab窗口输入
f=inline('sin(x)-x/3') HalfInterval(f,1,3)
得
23
另一个解为 X1=0
弦截法的matlab实现
function [p1,err,k,y]=secant(f,p0,p1,delta,max1) % fê????¨μ?·???D?oˉêy % p0,p1?a3?ê??μ % delta?a???¨?ó2??? % max1ê?μü′ú′?êyμ?é??T % p1?a?ù?óμ?μ?·?3ìμ??ü???a % err?ap1-p0?????μ % k?a?ùDèòaμ?μü′ú′?êy % y=f(p1)
k=0,p0,p1,feval('f',p0),feval('f',p1) for k=1:max1
p2=p1-feval('f',p1)*(p1-p0)/(feval('f',p1)-feval('f',p0)); err=abs(p2-p1); p0=p1; p1=p2;
k,p1,err, y=feval('f',p1) if(err 函数 function y=f(x) y=sin(x)-x/3; 主函数 clear all;clc 24 secant('f',-1,3,10^-6,30) 运行结果为 近似为 0 当主函数为 clear all;clc secant('f',1,3,10^-6,30) 运行结果为 25
相关推荐: