黃金分割法編程
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…。由於菲波那契數都是整數,兩個整數相除之商是有理數,所以只是逐漸逼近黃金分割比這個無理數。但是當我們繼續計算出後面更大的菲波那契數時,就會發現相鄰兩數之比確實是非常接近黃金分割比的敏鎮。