参考网址:
https://blog.youkuaiyun.com/nwpuwyk/article/details/28470645
https://blog.youkuaiyun.com/w8253497062015/article/details/79534098
原理
代码
JAVA版本
private static void fibonacci(float start, float end, float eps) {
float Fn_1, Fn;
int n;
float L1 = end - start;
float Ln = eps;
n = 2;
Fn = F(n);
//求要经过几轮区间长度才可以小于eps
while(Fn <= L1 / Ln) {
n ++;
Fn = F(n);
}
Fn_1 = F(n - 1);
float t1, t2, f1, f2;
float a = Math.min(start, end);
float b = Math.max(start, end);
t1 = b - (b - a) * Fn_1 / Fn;
t2 = a + b - t1;
f1 = fun(t1);
f2 = fun(t2);
while(b - a >= Ln) {
if(f2 < f1) {
a = t1;
t1 = t2;
t2 = a + b - t1;
f1 = f2;
f2 = fun(t2);
} else {
b = t2;
t2 = t1;
t1 = a + b - t2;
f2 = f1;
f1 = fun(t1);
}
}
System.out.println((b + a) / 2);
}
private static float F(int n) {
if(n == 0 || n == 1) return 1;
return F(n - 1) + F(n - 2);
}
private static float fun(float x) {
return (float) Math.sin(x);
}
C++版本
#include <stdio.h>
#include <time.h>
#include <math.h>
#define f(x) (-(x + 10*sin(5*x) + 7*cos(4*x)))
#define Q 0.382
float goldsearch(float a, float b, int n)
{
float x, y;
for (int i = n; i > 0; i--) {
float x = a + Q*(b - a);
float y = a + (1 - Q)*(b - a);
if (f(x) < f(y)) {
a = a;
b = y;
}
else {
a = x;
b = b;
}
}
if (f(a) < f(b)){
return a; }
else{
return b;
}
}
float fibonacci_num(int n)
{
if (n <= 2) return 1;
else return fibonacci_num(n - 1) + fibonacci_num(n - 2);
}
float fibonacci_search(float a, float b, int n)
{
float q[255] = {0};
for(int i = n; i >= 0; i--) {
q[n-i+1] =1- (fibonacci_num(i + 2) / fibonacci_num(i + 3));
// printf("q[%d] = %f\n", n - i + 1, q[n - i + 1]);
}
float x, y;
for (int i = 1; i <= n; i++) {
float x = a + q[i]*(b - a);
float y = a + (1 - q[i])*(b - a);
if (f(x) < f(y)) {
a = a;
b = y;
}
else {
a = x;
b = b;
}
}
if (f(a) < f(b)) {
return a;
}
else {
return b;
}
}
double* CallBack_GetTime(float a, float b, int n,float (*search)(float , float , int ))
{
double start, end, delta_time, ans[2] = {0};
start = clock();
ans[0] = (*search)(a, b, n);
end = clock();
delta_time = (end - start)/ CLOCKS_PER_SEC;
ans[1] = delta_time;
return ans;
}
int main()
{
double *gold_ans = CallBack_GetTime(0, 9, 20, goldsearch);
printf("黄金分割法——在X = %f 时取得最小值,搜索花费时间为%f\n\n", gold_ans[0],gold_ans[1]);
double *fibo_ans = CallBack_GetTime(0, 9, 20, fibonacci_search);
printf("斐波拉契法——在X = %f 时取得最小值,搜索花费时间为%f\n\n", fibo_ans[0],fibo_ans[1]);
while (1);
return 0;
}