c语言二等分,二分法求解单变量非线性方程及其应用与实现

戚兴龙

【摘要】在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了我们迫切需要解决的问题。近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。我们知道,对于单变量非线性方程f(x)=0,一般都可采用迭代法求根,由此产生了二分法。

【关键词】二分法 单变量 非线性方程收敛性 误差

一、引言

在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了我们迫切需要解决的问题。近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。我们知道,对于单变量非线性方程f(x)=0,一般都可采用迭代法求根,由此产生了二分法。

二、二分法

一般地,对于函数f(x),如果存在实数c,当x=c时f(c)=0,那么把x=c叫做函数f(x)的零点。

解方程即要求f(x)的所有零点。

先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b)>0,a

①如果f[(a+b)/2]=0,该点就是零点,

如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用中点函数值判断。

如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2=>b,从①开始继续使用中点函数值判断。

这样就可以不断接近零点。

通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。

给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:

1.确定区间[a,b],验证f(a)•f(b)<0,给定精确度ξ.

2.求区间(a,b)的中点c.

3.计算f(c).

(1)若f(c)=0,则c就是函数的零点;

(2)若f(a)•f(c)<0,则令b=c;

(3)若f(c)•f(b)<0,则令a=c.

4.判断是否达到精确度ξ:即若┃a-b┃

由于计算过程的具体运算复杂,但每一步的方式相同,所以可通过编写程序来运算。

三、实例引入

二分法求解单变量非线性方程的例子很多,仅以此例进行分析:

求方程f(x)=x3-x-1=0在区间[1.0,1.5]内的一个实根,要求准确到小数点后第2位。

四、问题分析

对于以上单变量非线性方程,已知a=1.0,b=1.5,采用二分法求解。首先我们根据二分法所允许的误差范围求得应迭代次数。

二分法允许的误差公式:|x*- | ( - )/2=(b-a)/0.005,

其中k为二分次数。

所以求得本题应二分6次达到预定的精度。

五、解题过程

这里a=1.0,b=1.5,而f(a)<0,f(b)>0。[a,b]的中点x0=1.25,将区间二等分。由于f(x0)<0,即f(x0)与f(a)同号,故所求根x*必在x0右侧,这是应令a1=1.25,b1=1.5,得到新的有根区间[a1,b1].如此反复二分6次,结果如下:

K/二分次数 /区间

左边界值 /右边界值 F( )的符号

六、基本二分法的matlab实现与C语言实现

6.1 %二分法的算法及MATLAB实现

function [c, err, yc] = bisect(f, a, b, delta)

% f是所要求解的函数

% a和 b分别是有根区间的左右限

% delta是允许的误差界

% c为所求的近似解

% yc为函数 f在 c上的值

% err是 c的误差估计

if nargin < 4

delta = 1e -5;

end

ya = feval (f, a);

yb = feval (f, b);

if yb == 0, c = b, return

end

if ya * yb > 0

disp((a, b)不是有根区间);

return

end

max1 = 1 + round((log(b - a) - log(delta))/log(2));

for k = 1:max1

c = (a + b)/2;

yc = fevel(f, c);

if yc == 0 a = c; b = c; break,

elseif yb * yc > 0

b = c; yb = yc;

else

a = c; ya = c;

end

if (b - a) < delta, break

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值