查字典论文网 >> 二分法求解单变量非线性方程及其应用与实现

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

小编:

论文关键词:二分法 单变量 非线性方程 收敛性 误差

论文摘要:本文主要通过一个实例来研究单变量非线性方程f(x)=0的二分法求解及此方法的收敛性,根据误差估计确定二分次数并进行求解。同时实现matlab和C语言程序编写。从而掌握过程的基本形式和二分法的基本思想,在以后的学习过程中得以应用。

1. 引 言

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

2. 二分法

一般地,对于函数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<b

①如果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┃<ξ,则得到零点近似值a(或b),否则重复2-4.

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

3. 实例引入

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

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

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

其中k为二分次数。

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

5. 解题过程 K/二分次数 /区间

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

0

1

2

3

4

5

61.0 1.3125 1.375

1.3438 1.375 1.3438 1.3203 +

+

+

6. 基本二分法的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 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

end

k, c = (a + b)/2, err = abs(b - a), yc = feval(‘f’, c)

6.2 %基本二分法的C语言实现

方程式为:f(x) = 0,示例中f(x) = 1+x-x^3

使用示例: solution: 1.32472

源码如下:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <assert.h>

double f(double x)

{

return 1+x-x*x*x;

}

int main()

{

double a = 0, b = 0, e = 1e-5;

printf("input a b e: ");

scanf("%lf%lf%lf", &a, &b, &e);

e = fabs(e);

if (fabs(f(a)) <= e)

{

printf("solution: %lgn", a);

}

else if (fabs(f(b)) <= e)

{

printf("solution: %lgn", b);

}

else if (f(a)*f(b) > 0)

{

printf("f(%lg)*f(%lg) > 0 ! need <= 0 !n", a, b);

}

else

{

while (fabs(b-a) > e)

{

double c = (a+b)/2.0;

if (f(a)* f ( c ) < 0)

b = c;

else

a = c;

}

printf("solution: %lgn", (a+b)/2.0);

}

return 0;

}

7.方法总结

7.1二分法解题的基本步骤:

1)计算f(x)的有根区间[a,b]端点处的值f(a),f(b)。

2)计算f(x)的区间中点的值f((a+b)/2)。

3)进行函数值的符号比较。

4)根据误差估计二分到一定次数达到精度,从而求得近似值。

7.2二分法的优缺点:

优点:算法简单,容易理解,且总是收敛的

缺点:收敛速度太慢,浪费时间

所以,在以后的学习过程中,我们将根据方程的形式和二分法的优缺点不单独将其用于求根,只用其为根求得一个较好的近似值,方便其他方法的运算。

8. 结 论

(1)针对现实中的许多剖面设计、轨道设计等关键参数方程中三角函数多、计算工作量较大、迭代收敛条件强等问题,采取数学变化的方法将该方程转化成一个只包含对数函数和多项式函数的新方程,并提出了寻找求解区间的步长搜索算法和自适应步长搜索算法,进而使用二分法求新方程的数值解。

(2)数学分析和数值实践表明,该算法不仅能够正确判断设计方程是否有解,而且在有解的情况下能够正确求出该解,计算量小,计算过程稳定。

参考文献 【2】许小勇,宋昔芳; 一种求解非线性方程全部实根的算法与实现 [J];科技广场;2007年01期; 15-17

【3】王兴华,郭学萍; 二分法及其各种变形收敛性的统一判定法则 [J];高等学校计算数学学报; 1999年04期

【4】苗慧; 解非线性方程的若干算法的收敛性分析 [D];浙江大学; 2006年

【5】李晓霞; 关于若干迭代算法的收敛性分析 [D];浙江大学; 2002年

【6】李庆扬,王能超,易大义;数值分析第4版 TUP 清华大学; 2001年5月

热点推荐

上一篇:浅析和谐的心理健康课堂模式解析与应用探讨

下一篇:如何对幼儿进行德育教育论文 幼儿园关于德育教育之类的论文

对音乐素养课程的心得范文(15篇) 八年级英语教学计划学情分析大全(8篇)