最优化第二讲——一维搜索法(斐波那契法和java实现)

先看一下斐波那契数列

这个很容易理解,就是当前的值等于前两个值的和

斐波那契法的递归结构如下


步骤一:我们首先要知道需要精确到的区间长度,例如要在[1, 10]之间搜索极小值点,希望精确到0.5之间,那么也就是我最后要求得的Ln的长度要小于等于0.5。所以这个时候就能知道经过几轮计算可以达到这个精度,斐波那契数列指的是:Fn=F(n-1)+F(n-2)。上图可知Ln与Fn是有关系的,所以可以求得满足Ln小于等于0.5的Fn,也就知道了可以迭代几轮。

步骤二:求出L2,L2=L1*F(n-1)/F(n),这个式子可以由上图得到,就是要确定最开始的t1、t2点,然后比较t1、t2点对应的函数值得大小,缩小区间,缩小区间的方法跟通用方法一致,如果t1的函数值f1大于t2的函数值f2,那么区间缩小为[t1, 10],否则区间缩小为[1, t2]

步骤三:如果区间缩小为[t1, 10],这个时候t1=t2,而t2的值等于t1在这个区间内的对称值。其实我们可以看到只有第一步需要计算两个点的函数值,其他步都只要计算一个点的函数值就行,因为另外一个点的函数值由上一步遗留下来

代码实现如下

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private static void fibonacci(float start, float end, float eps) {  
  2.           
  3.         float Fn_1, Fn;  
### 斐波那契搜索简介 斐波那契搜索是一种基于斐波那契数列的区间缩小,广泛应用于单峰函数的一维极值问题求解。该方通过预先计算好的斐波那契比例来逐步缩小区间范围,最终逼近最优解的位置。 ### 斐波那契搜索的MATLAB实现 下面是一个完整的斐波那契搜索在MATLAB中的实现: #### 函数定义 ```matlab function [xmin, fmin] = fibonacci_search(f, a, b, tol) % FIBONACCI_SEARCH 使用斐波那契搜索寻找给定区间的最小值 % % 输入参数: % f - 被优化的目标函数句柄 % a - 搜索区间的左端点 % b - 搜索区间的右端点 % tol - 收敛精度 (停止条件) if nargin < 4 || isempty(tol), tol = eps^(1/2); end n = ceil((log(b-a)-log(tol))/log(golden_ratio)); % 计算所需的迭代次数 F = zeros(1,n); F(1) = 1; F(2) = 1; for k=3:n+1 F(k) = F(k-1)+F(k-2); end c = b-(b-a)*F(n)/F(n+1); d = a+(b-a)*F(n)/F(n+1); fc = feval(f,c); fd = feval(f,d); for i=n:-1:1 if fc < fd b = d; d = c; fd = fc; c = b-(b-a)*F(i-1)/F(i); fc = feval(f,c); else a = c; c = d; fc = fd; d = a+(b-a)*F(i-1)/F(i); fd = feval(f,d); end if abs(b-a)<tol*abs(a+b)+eps*(b-a) break; end end xmin = (a+b)/2; fmin = feval(f,xmin); golden_ratio = (sqrt(5)-1)/2; % 黄金分割率近似等于0.618 ``` 此代码实现了标准的斐波那契搜索过程,并返回目标函数`f(x)`在指定范围内取得局部最小值时对应的自变量位置`xmin`以及此时的目标函数值`fmin`[^1]。 为了更好地理解测试上述算的效果,可以考虑如下示例场景: 假设有一个简单的二次多项式作为被寻优的对象: ```matlab fun = @(x)(x.^2 + 2*x + 1); [x_optimal, y_optimal] = fibonacci_search(fun,-5,5,1e-6); disp(['Optimal point is at x=', num2str(x_optimal)]); disp(['Minimum value of the function is:',num2str(y_optimal)]); ``` 这段脚本会调用之前编写的斐波那契搜索器,在[-5,5]之间找到使得`fun(x)=x^2+2x+1`达到最低点的具体坐标,并打印出来。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值