Optimeringsproblem i MATLAB mha gradientvektor

Trädvy Permalänk
Medlem
Registrerad
Okt 2015

Optimeringsproblem i MATLAB mha gradientvektor

Hej, jag har fått i uppgift att hitta lokalt minimum för en yta i matlab genom att använda gradient vektorn. Jag får det inte riktigt till att fungera. Jag anar att jag måste byta tecken på funktionen eftersom gradienten pekar ut maxima? Men något jag inte förstår är varför matlab inte verkar hitta v(1) som siffra? Matlab har också något emot " norm(grad) > tol... Snälla hjälp mig.

Så här ser min kod ut just nu:

function w = MinimeraAnalytiskGradient(f,dfdx,dfdy,v,h,tol)

v=[2,3];

f = @(v)(v(1)).^4-(v(1)).^2+(v(2))^2;

dfdx = @(v)4*v(1)^3-2*v(1);

dfdy = @(v)2*v(2);

h=1;

tol=0.1;

grad=@(v)[dfdx(v),dfdy(v)];

while norm(grad) > tol

v=v-h.*grad(v);

grad=[dfdx(v), dfdy(v)];

end

w=v;

end

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Apr 2008

Om jag undantar att du skriver över all indata till MinimeraAnalytiskGradient i själva funktionen så finns det två saker som ser lite underliga ut:

  • norm(grad) innebär normering av ett funktionshandtag, du vill nog ha norm(grad(v)) e dyl.

  • grad=[dfdx(v), dfdy(v)] skriver över funktionshandtaget med en array, om du sedan kör grad(v) i nästa iteration så tolkar Matlab det som att du vill indexera i grad med positionerna i v, vilket antagligen inte går något vidare.

Trädvy Permalänk
Medlem
Plats
Utanför hjärnan
Registrerad
Jan 2010

Det här är skrivet i Octave..

%% fun.m %%
function z=fun(x,y)
z=3*(x-2)^2+2*(y-3)^2+1;
endfunction

%% grad.m %%
function [f_x,f_y]=grad(x,y,h)
f0=fun(x,y);
f_x=(fun(x+h,y)-f0)/h;
f_y=(fun(x,y+h)-f0)/h;
endfunction

%% test.m %%
tol=1E-12; %tolerance
h=1E-5; %step length in grad approx
d=1E-2; %max step length in search
x=0; y=0; %start values
val=fun(x,y);
old_val=inf;
while (abs(val-old_val)>tol),
[f_x,f_y]=grad(x,y,h);
df=[f_x,f_y]*h;
if norm(df)>d,
df=df/norm(df)*d;
endif
x=x-df(1);
y=y-df(2);
old_val=val;
val=fun(x,y);
endwhile
[x,y,val]