论文关键词:二分法 单变量 非线性方程 收敛性 误差
论文摘要:本文主要通过一个实例来研究单变量非线性方程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. 实例引入二分法求解单变量非线性方程的例子很多,仅以此例进行分析:
求方程f(x)=x³-x-1=0在区间[1.0,1.5]内的一个实根,要求准确到小数点后第2位。
4. 问题分析对于以上单变量非线性方程,已知a=1.0,b=1.5,采用二分法求解。首先我们根据二分法所允许的误差范围求得应迭代次数。
二分法允许的误差公式:|x*- 0.005,
其中k为二分次数。
所以求得本题应二分6次达到预定的精度。
5. 解题过程这里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/二分次数
/区间
左边界值
/右边界值
)的符号
0
1
2
3
4
5
6
1.0
1.25
1.3125
1.3203
1.5
1.375
1.3438
1.3281
1.25
1.375
1.3125
1.3438
1.3281
1.3203
1.3242
-
+
-
+
+
-
-
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
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
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
使用示例:
input a b e: 1 2 1e-5
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: %lg\n"