• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

题目:用二分法求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语言实现代码如下:

#include<stdio.h> #include<math.h> #define f(x) (x*x*x+x*x-3*x-3) main() { float x,x1,x2; int t; t=0; x=0.0; x1=0.0; x2=10.0; while(fabs(x1-x2)>1e-3) { t++; x=(x1+x2)/2.0; if(f(x)<0.0) { x1=x; printf("x1=%f ",x1); } else if(f(x)>0.0) { x2=x; printf("x2=%f ",x2); } else if(f(x)==0.0) break; } x=(x1+x2)/2.0; printf("\n\nx=%f\n",x); printf("The loop number t=%d\n",t); }

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

f=inline('x^3+x^2-3*x-3') %把f=x^3+x^2-3*x-3设定为内嵌函数 x1=1.0,x2=2.0 %给定区间[a,b]即[x1,x2]一个初值,这里为[1.0,2.0]. err=1e-3; %给出精度为1E-3。 k=0; %k为一个计数变量,为了统计符合精度时,二分的循环次数。给初值0. while abs(x1-x2)>err; %二分循环的结束条件,最后一次的解变量与倒数第二次的解变量 %的差的绝对值,比精度err小时,则循环结束,否则,循环继续。 x=(x1+x2)/2; %给方程的解变量赋一个初值,为区间的中点。 k=k+1; %循环一次k自加1. format long %对从此行一下的变量进行长精度格式化。 x %这里的x的作用是,显示每次循环时二分之后的当前x的值。 if(f(x)<0) %若为负数即f(x)<0,则把((x1+x2)/2)赋给x1,即新区间的左端点。 x1=x; else if(f(x)>0) %若为正数即f(x)>0,则把((x1+x2)/2)赋给x2,即新区间的右端点。 x2=x; else if(f(x)==0) %若为零即f(x)==0,则找到方程的根。 end end end end x %输出最终的解x k %输出二分法的循环次数

在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]区间上,可继续用二分法求出。



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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Vim'sSettingforEditingMatlabFiles发布时间:2022-07-18
下一篇:
Qt与Matlab混合编程细节总结发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap