在MATALB中寻找千里马的爬山算法

时间:2017-03-12 05:28:58

标签: algorithm matlab

我正在尝试在MATLAB中创建一个程序,我们必须在其中找到最大值。 我使用的算法是将给定点与两个相邻点进行比较。 如果下一个点大于当前值,则以正方向迭代。 如果下一个点小于当前值,则沿负方向迭代。 如果前一个点和下一个点小于当前点,则达到最大值。

我用flag变量做了一个while循环。但是它无法检测到最大值。

我将x初始化为某个数字(比如x = 0) 函数'f(x)= -x ^ 2 -3;' 变量'xint'是设置为0.1的区间。 变量'i'只是为了保持计数。

clc
clear all

syms x

f(x) = -x^2+3;
max = 0;
x = 0;
xint = 0.1;
flag =1;

while(flag ==1)
    fprintf('\ninside while\n')
        if(f(x+xint)> f(x))
              x = x + xint;
              fprintf('inside first: Value of x is set to = %f, where function value is %f', x, f(x));

       elseif(f(x+xint) < f(x))
               x = x-xint;
               fprintf('inside second: Value of x is set to = %f, where function value is %f', x, f(x)); 

       else if(f(x-xint)<f(x) & f(x+xint) < f(x))
              disp('Max detected')
              max = x;
              flag =0;
       end
       i = i+1;
 end

任何帮助对我都有用。

非常感谢你。

阿努邦

输入: f(x)= -x ^ 2 + 3;

输出: 该程序不会进入第三个else if语句。因此while循环继续运行。

2 个答案:

答案 0 :(得分:0)

您不能拥有else条款的条件。另外,如果你要将else变为elseif,那么当你在前一个elseif的条件为真时,你所写的条件是真的,那么它是无法到达的,但在if-elseif语句中,每次只执行一个子句。

更改elseif的条件并获取else的条件:

   elseif(f(x-xint) > f(x))
           x = x-xint;
           fprintf('inside second: Value of x is set to = %f, where function value is %f', x, f(x)); 

   else
          disp('Max detected')
          max = x;
          flag =0;
   end

答案 1 :(得分:0)

我假设xint是一个正值,你的函数是二阶polinomial,负常数(i.e. y = a*x^2+b where a < 0),然后:

if f(x+xint) > f(x) % go to right.
     x1 = x+xint; 
else                     %  go to left
     x1 = x
     xint = -xint;
 end

 while f(x1) > f(x1+xint)
      x1 = x1+xint;
 end

这里x1是最大值或非常接近它的东西。