0

この非線形の制約のない最適化問題があります: f=2*pi*(x^2)+2*pi x y

そして、ニュートン法と勾配法という 2 つの方法を使用して、MatLab で解決する必要があります。コードを書きましたが、修正できないエラーがいくつか発生したため、これらのメソッドの結果をグラフにして比較する必要があるため、本当に助けが必要です。

勾配法のコード:

これは問題によって与えられる関数です:

function f=functie()
  syms x y;
  f=(2*pi*(x^2))+(2*pi*x*y);
end

これは、特定の点での関数の評価です。

function y = feval_obj(x)
 y=(2*pi*(x(1)^2))+(2*pi*x(1)*x(2));
end

これは、その特定のポイントでの関数の勾配です。

function y = gradient_obj(val)
 gradient_f = gradient(functie);
 syms x y;
 y = subs(gradient_f, [x, y], val);
end

問題の反復ごとに理想的なステップを確認する必要があるため、関数 f(x + alpha*d) の値を返す別の関数が必要です。

function f = phi_obj(alpha, x, d)
 f = feval_obj(x + alpha * d);
end

グラデーション メソッドのコードは次のようになります。

function xmin=gradient_method(x0,eps)
 %Initializing of the vectors/matrix that we need
 puncte_gradient=[]; %gradient points 
 puncte_iteratie=[]; %iteration points
 valori_functie=[]; %function values 
 norme_gradienti=[]; %gradients norm
 %I will use a vector g to keep the current gradient
 x=x0; 
 g=gradient_obj(x); 
 while(norm(g)>eps)
  g=gradient_obj(x); 
  puncte_gradient=[puncte_gradient g];
  puncte_iteratie=[puncte_iteratie x];
  valori_functie=[valori_functie; feval_obj(x)];
  norme_gradienti=[norme_gradienti; norm(g)];
  alpha=fminsearch(@(alpha) phi_obj(alpha,x,-g), 1);
  x=x-alpha*g
 end
 xmin=x;

 %This is the chart display of the data I get 
 t=1:length(valori_functie);
 figure(1)
 hold on
 plot(t,norme_gradienti(t),'k','LineWidth',2);
 hold off
 figure(2)
 hold on
 plot(t,valori_functie(t),'k','LineWidth',2);
 hold off

 % For drawing the contour lines and the gradient method_s evolution we have: 
 [x1,x2]=meshgrid([1.2:0.01:2.8],[0.4:0.01:1.6]);
 z=(2*pi*(x1^2))+(2*pi*x1*x2);
 figure(3)
 hold on
 contour(x1,x2,z,valori_functie);
 plot3(puncte_iteratie(1,:),puncte_iteratie(2,:),valori_functie,'r');
 scatter3(puncte_iteratie(1,:),puncte_iteratie(2,:),valori_functie,'filled');
 hold off
end

これを修正でき次第、Newton Method で投稿を更新します。なぜエラーが発生するのか、誰にもアイデアがありますか? 理想的なステップを見つけるには、x0が初期値で、epsが許容値である必要があります。(勾配のノルムが許容値より大きい場合、アルゴリズムは停止する必要があります)。

4

0 に答える 0