2017-03-12 15 views
0

私は最大値を見つけなければならないMATLABでプログラムを作成しようとしています。 私が使用しているアルゴリズムは、与えられた点を2つの隣接点と比較しています。 次のポイントが現在より大きい場合は、正の方向に反復します。 次の点が現在よりも小さい場合は、負の方向に繰り返します。 前のポイントと次のポイントが現在よりも小さい場合、最大値に達しました。MATALBで最大値を見つけるためのヒルクライミングアルゴリズム

フラグ変数で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。

出力: whileループが実行されているため、statement.Andというプログラムが3番目のelseに入力されません。

+0

あなたのデータは?例とその出力を与えれば、あなたが意味するものを理解することができます。説明は非常に混乱しています – smttsp

答えて

0

else句の条件を設定することはできません。さらに、elseelseifにすると、あなたが書いた条件として到達できないことがありました。前のelseifの条件が真である場合は真ですが、if-elseifの文では1つの句しか実行されません毎回。

変更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 
0

私は、その後、XINTが正の値であり、あなたの関数が負の定数(i.e. y = a*x^2+b where a < 0)と二度polinomialであると仮定しています:

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は最大値またはそれに非常に近い値です。

関連する問題