当前位置:文档之家› 0.618与二分法的学习

0.618与二分法的学习

0.618法的实例研究:一、算法理论黄金分割法是用于一元函数)(x f 在确定的初始区间],[b a 内搜索极小点a '的一种方法。

它是优化计算中的经典算法,以算法简单、效果明显而著称,是许多优化算法的基础。

但它只适用于某个区间上的凸函数。

其基本思想是:依照“去坏留好”原则,对称原则,以及等比收缩原则来逐步缩小搜索范围。

0.618法适用于单峰区间函数,即所在区间],[b a 上。

具体的说,对于单峰函数,只需选择两个试探点,即在区间],[b a 中取点)(382.01a b a x -+=,)(618.02a b a x -+=,且21x x <,就可以将包含极小点*x 的区间缩短。

事实上,必有:若)()(21x f x f >,则],[1*b x x ∈;若)()(21x f x f ≤,则],[2*x a x ∈。

根据单峰函数这个性质,就可以不断迭代缩小包含极小点的区间。

若进行k 次迭代后,有],[*k k b a x ∈,那么我们在区间],[k k b a 取两个试探点)(382.01a b a x -+=,)(618.02a b a x -+=,且21x x <,计算)(),(21x f x f 的值。

如果)()(21x f x f =,令b x a x ==21,,那么计算||b a -,如果ξ≤-||b a (ξ为所给的精度),则*2x b a =+;如果 )()(21x f x f >,令11x a k =+,k k b b =+1;如果)()(21x f x f <,令k k a a =+1,21x b k =+,如此继续。

这样每次可将搜索区间缩小0.328倍或者0.618倍,直至缩为一点。

黄金分割原理如图1所示,其中618.0=K ,区间长度为L 。

该算法为收敛速度很快的一种搜索方法。

图1.二、算法框图三、算法程序用10xf,区间为]8,2[,e取0.01为例x=x-)(2+7用C语言编程程序如下:#include <stdio.h>#include <math.h>#include <stdlib.h>#define f(x) x*x-7*x+10double hj(double *a,double *b,double e,int *n){double x1,x2,s;if(fabs(*b-*a)<=e)s=f((*b+*a)/2);else{x1=*a+0.382*(*b-*a);x2=*a+0.618*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}main(){double s,a,b,e;int n=0;printf("Please input left boundary right boundary precision:\n"); scanf("%lf%lf%lf",&a,&b,&e);//输入区间和精度的值s=hj(&a,&b,e,&n);//调用hj函数,其中n代表迭代次数printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n);}四、算法实现方程为10xx=xf,区间是]8,2[,精度是0.01。

7-)(2+解:运行程序(1)输入2 8 0.01(2)显示出运行结果二分法求解单变量非线性方程及其应用与实现: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*- | ( - )/2=(b-a)/ 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次,结果如下: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 < 4delta = 1e -5;endya = feval (’f’, a);yb = feval (’f’, b);if yb == 0, c = b, returnendif ya * yb > 0disp(’(a, b)不是有根区间’);returnendmax1 = 1 + round((log(b - a) - log(delta))/log(2));for k = 1:max1c = (a + b)/2;yc = fevel(’f’, c);if yc == 0 a = c; b = c; break,elseif yb * yc > 0b = c; yb = yc;elsea = c; ya = c;endif (b - a) < delta, breakendendk, c = (a + b)/2, err = abs(b - a), yc = feval(‘f’, c)6.2基本二分法的C语言实现方程式为:f(x) = 0,示例中f(x) = k=2*x*x*x-4*x*x-6使用示例:input a b e: 1 2 1e-5solution: 1.32472源码如下:include<stdio.h>#include<conio.h>#include<math.h>double err=0.00001;double f(double x){double k;k=2*x*x*x-4*x*x-6;return k ;}void main(){double a=-10.0;double b=10.0;double c;c=(a+b)/2;while( f(c)*f(c)>err*err){if( f(c)>0){a=a;b=c;c=(a+b)/2;}if( f(c)<0){a=c;b=b;c=(a+b)/2;}}printf("The x is %lf the value is %lf",c,f(c) );}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)数学分析和数值实践表明,该算法不仅能够正确判断设计方程是否有解,而且在有解的情况下能够正确求出该解,计算量小,计算过程稳定。

相关主题