黄金分割法编程
1. c语言编程,用黄金分割法求f(a)=a*a-7*a+10的最优解。设初始值a0=0,初始步长h=1,取迭代精度=0.35。急…
#include <stdio.h>
#include <math.h>
float GetEquation(float x)
{
return x*x-7*x+10;
}
void main()
{
float a=0;
float b=6;
float result = 0;
do {
float c=a+0.618*(b-a);
float d=a+b-c;
if(fabs(GetEquation(c)) < fabs(GetEquation(d)))
{
a=d;
result = c;
}
else
{
b=c;
result = d;
}
} while(fabs(GetEquation(result)) > 0.01);
printf("f(a)=a*a-7*a+10\n");
printf("a=%f\n",result);
}
2. c语言编程:用黄金分割法求 minf(x)=x2+2x+1 急!!!!
给,已经编译运行确认:
#include "math.h"
#include "stdio.h"
#define f(x) x*x+2*x+1 //一元函数,这里按照你的要求写的是:x2+2x+1
//函数功能是用黄金分割法实现求一元函数 的最优解
double 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;
scanf("%lf %lf %lf",&a,&b,&e); // 输入区间[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);
}
运行时:
输入:0.6 0.5 0.1
输出结果为:
0.6 0.5 0.1
a=0.600000,b=0.500000,s=2.402500,n=0
3. 用Matlab实现黄金分割法,优化目标函数minf(x)=2x^2-x-1,初始区间为[-1,1],e=0.001
首首悄先在matlab新建文件保存为goldmin.m
function[x,y] = goldmin(f,xa,xb,s)
% 黄金分割法桥芹粗求解函数最小值
% 输入
% f 待优化函数
g = (sqrt(5)-1)/2; % 黄金分割比,0.618
a = xa;
b = xb;
x2 = a + g*(b-a);
x1 = a + b - x2;
y1 = f(x1);
y2 = f(x2);
while abs(b-a) > s
if y1<y2
b = x2;
x2 = x1;
x1 = a + b - x2;
end
>> f = @(x) 2*x^2-x-1;
>> [x,y]=goldmin(f,-1,1,0.001)
x =
0.2497
y =
-1.1250
>>
即当x=0.2497时取最小值-1.125
菲波那契数列
经研究发现,相邻两个菲波那契数的比值是随序号的增加而逐渐趋于黄金分割比的。即f(n-1)/f(n)→0.618…。由于菲波那契数都是整数,两个整数相除之商是有理数,所以只是逐渐逼近黄金分割比这个无理数。但是当我们继续计算出后面更大的菲波那契数时,就会发现相邻两数之比确实是非常接近黄金分割比的敏镇。