二分法非线性方程求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、编程实现以下科学计算算法,并举一例应用之(参考书籍《精通MATLAB 科学计算》,王正林等编著,电子工业出版社,2009年) “二分法非线性方程求解”
二分法的具体求解步骤如下。
(1)计算函数f(x)在区间[a,b]中点的函数值f((a+b)/2),并作下面的判断: 如果0)2
(
)(<+b
a f a f ,转到(2)
; 如果0)2(
)(>+b a f a f ,令 2b
a a +=
,转到(1); 如果 0)2()(=+b a f a f ,则 2b
a x +=
为一个跟。 (2)如果 ε<+-|2|b a a (ε为预先给定的精度)
,则4
3a
b x +=为一个根,否则令2b
a b +=,转到(1)。
在MATLAB 中编程实现的二分法函数为:HalfInterval 。 功能:用二分法求函数在某个区间上的一个零点。 调用格式:root=HalfInterval(f,a,b,eps). 其中,f 函数名; a 为区间左端点; b 为区间右端点;
eps 为根的精度; root 为求出的函数零点。
二分法的MATLAB 程序代码如下:
function root=HalfInterval(f,a,b,eps) %二分法求函数f 在区间[a,b]上的一个零点 %函数名:f %区间左端点:a %区间右端点:b %根的精度:eps %求出的函数零点:root if (nargin==3) eps=1.0e-4;
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==o)
r=(a+b)/2;
else
if(abs(b-a)<=eps)
r=(b+3*a)/4; %输出根
else
s=(a+b)/2;
r=FindRooots(f,a,b,eps); %左递归
end
end
end
流程图:
实例应用:
采用二分法求方程0133=+-x x 在区间[0,1]上的一个根。
解: 流程图:
在MATLAB 命令窗口中输入:
r=HalfInterval('x^3-3*x+1',0,1)
运行结果:
2、编程以解决以下科学计算问题。
试验6 现有一平面上的封闭曲线,取一点建立坐标系,每隔9
弧度测一点,数据如下表: i 0和18 1 2 3 4 5 6 7 8 Xi 100 134 164 180 198 195 186 160 136 Yi
503
525
514.3 451.0 326.5 188.6 92.2
59.6
62.2
输入:r=HalfInterval('x^3-3*x+1',0,1)
输出r
调用HalfInterval 函数
开始
结束
用周期样条求曲线轮廓并作图。
分析:
将周期样条分成两部分来求,最后画在一个图上。用spline进行拟合。流程图:
源程序:
>> x1=[0 5 17 32 63 100 134 164 180 198];
y1=[280.5 324.9 369.4 413.8 458.3 503 525 514.3 451 326.5];
x11=[0:1:198];
y11=spline(x1,y1,x11);
plot(x11,y11,'*-',x1,y1,'-.rd')
hold on
x2=[198 195 186 160 136 100 66 35 15 0 ];
y2=[326.5 188.6 92.2 59.6 62.2 102.7 147.1 191.6 236.0 280.5]; x22=[198:-1:0];
y22=spline(x2,y2,x22);
plot(x22,y22,'*-',x2,y2,'-.rd') legend('计算数据','实验数据') 运行结果:
实验7 用电压V=10伏的电池给电容器,电容器上t 时刻的电压
)/ex p()()(0r t V V V t V ---=,其中0V 是电容器的初始电压,t 是充电常数,试
由下面一组V ,t 数确定0V 和r 。 t/s 0.5
1 2 3 4 5 6 7 V/V 6.36 6.48 7.26 8.22 8.66 8.99 9.43 9.63
分析:
采用最小二乘法进行拟合,对V (t )=V-(V-V 0)exp (-t/τ)两边求自然对数得到:log(V-V(t))=log(V- V 0)-t/τ
令k=-1/τ,w=log (V- V 0),x=t ,y=log (V-V (t ))。 得到方程:y=kx+w
流程图:
开始