`
tubaluer
  • 浏览: 1443547 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

用二分法解一元高次方程的单根(用两种语言描述的:C语言和Matlab语言)

 
阅读更多

题目:用二分法求f(x)=x^3+x^2-3*x-3=0的正根(精度要求精确到1E-3)。

(1)分析结果的正确性。

(2)进一步考虑如何求出所有根。


算法分析:

(1)分析题目要求,由于方程是一元三次方程。所以方程应该存在三个根,由于题目要求只求正根,所以下面在用二分法之前应先给定一个正区间。

(2)令f=x^3+x^2-3*x-3,并给定:区间[a,b],其中a>=0,且要保证f(a)*f(b)<0.

(3)这里首先令x1=a,x2=b,先给x一个初值为((x1+x2)/2),判断f((x1+x2)/2)即f(x)的正、负。

若为负数即f(x)<0,则把((x1+x2)/2)赋给x1(或x2),即新区间的左(或右)端点;

若为正数即f(x)>0,则把((x1+x2)/2)赋给x2(或x1),即新区间的右(或左)端点;

若为零即f(x)==0,则找到方程的根。

此步骤的原则是使新区间始终保证f(x1)*f(x2)<0。

在此题中由于经过判断知:f=x^3+x^2-3*x-3的一阶导在[1.0,2.0]上大于0,即f=x^3+x^2-3*x-3在[1.0,2.0]上单调增加。又因为此题中f(1)<0,f(2)>0,所以在没找到零点之前,这里的判断条件可以简化为判断区间中左、右端点的正负。与f(a)*f(b)<0的作用相同。

(4)重复步骤(3),直到找到方程的根,或者达到给定精度!则循环停止,这时的x值即为方程的近似值。


C语言实现代码如下:



Matlab代码如下(two_cut.m脚本文件的内容为):


在Matlab的命令行中输入(因为我的程序文件保存为:two_cut.m脚本文件):

>>two_cut

f=Inline function:

f(x)= x^3+x^2-3*x-3

x1=1

x2=2

x=1.500000000000000

x=1.750000000000000

x=1.625000000000000

x=1.687500000000000

x=1.718750000000000

x=1.734375000000000

x=1.726562500000000

x=1.730468750000000

x=1.732421875000000

x=1.731445312500000

x=1.731445312500000

k=10


结果分析:

在Matlab的命令行中输入:

>>format long

>>sqrt(3)

ans=1.732050807568877

在与用二分法所求的结果分析可知,有一定误差。通过k的值可知此程序在给定的区间上循

环了10次,经分析发现:用二分法解方程,其方法有以下缺点:收敛速度不快,无法求偶

重根,也无法求复根。

这里进一步分析如何求此方程的所有根:因为此方程是一元三次方程f=x^3+x^2-3*x-3=0,

所以理论上它有三个根。如果任用二分法求出它的其余两个根,那么我们应首先估算这两

根在数轴上的大概位置,然后给定合理的区间,再用二分继续处理。

这里在在Matlab的命令行中输入,并运行:

>>x=-2:0.001:2;

>>y=x.^3+x.^2-3*x-3;

>>plot(x,y)

>>grid on

可得到下图:


通过上图可知,另外两个根在[-2.0,-1.5]与[-1.5,-0.5]区间上,可继续用二分法求出。



本文为本人原创!如需使用,请注明出处!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics