3 svar
239 visningar
Svalan behöver inte mer hjälp
Svalan 25
Postad: 28 apr 2021 14:58

Extremvärden

Funktionen f(x,y)=(x2+y-11)2+(x+y2-7)2 Har ett lokalt maximum och fyra lokala minimum på området -5x,y5.

Jag ska hitta extrempunkterna med metoden gradient ascent där jag utnyttjar gradienten. 

Jag har lyckats hitta maximumpunkten så här:

x=-5:0.05:5; % vektor med x-värden
y=-5:0.05:5; % vektor med y-värden

[X,Y]=meshgrid(x,y); 
Z=(X.^2+Y-11).^2+(X+Y.^2-7).^2; 

C=10:10:190;
contour(X,Y,Z,C) 
axis equal
colormap jet
colorbar
hold on

fx=@(X,Y) 4.*X.^3+4.*X.*Y-42.*X+2.*Y.^2-14;
fy=@(X,Y) 4.*X.^3+4.*X.*Y-26.*Y+2.*X.^2-22;

x0=-2; % startpunkt x-koord
y0=-2; % startpunkt y-koord
h=0.01; % steglängd

[xs,ys]=GradientAscent(h,x0,y0,fx,fy); % beräknar vägen i gradientens riktning
plot(xs,ys,'-k','LineWidth',1.5) % rita ut vägen

xs(end) % x-koord lok max
ys(end) % y-koord lok max

 

function [x,y]=GradientAscent(h,x0,y0,fx,fy)
eps=h/10; % parameter
x(1)=x0; % startvärde x
y(1)=y0; % startvärde y
G=sqrt(fx(x0,y0)^2+fy(x0,y0)^2); % normen av gradienten
n=1; % index
while G>=eps && n<1000
    x(n+1)=x(n)+h*fx(x(n),y(n))/G; % steg i x-led
    y(n+1)=y(n)+h*fy(x(n),y(n))/G; % steg i y-led
    n=n+1; % öka index
    G=sqrt(fx(x(n),y(n))^2+fy(x(n),y(n))^2); % normen av gradienten
end
end

Jag hittar då maximumpunkten och grafen ser ut så här:

 

Jag ska nu modifiera funktionen GradientAscent så att den går mot minimum istället för maximum. Eftersom gradienten alltid är positiv tänkte jag att man bara behöver ändra stegen i x och y led genom att sätta in ett minustecken framför gradienten med då ser resultatet ut såhär:

 Det ser faktiskt ut som om linjen går mot i negativ riktning i början innan den drar iväg uppåt men längre än såhär kommer jag inte. Några förslag?

Svalan 25
Postad: 30 apr 2021 10:52

Så här ser det ut om jag väljer origo som startpunkt:

Det ser fortfarande ut som den går mot en minimumpunkt i början, för att sen avvika nedåt den här gången.

Laguna Online 30497
Postad: 30 apr 2021 11:03

Jag tycker fy ska ha 4.*Y.^3 i början, inte 4.*X.^3.

Svalan 25
Postad: 30 apr 2021 11:11

Ja nu känner man sig lite dum...  Självklart ska fy  bestå av Y. Jag gjorde misstaget att anta att allt utom själva GradientDescent var rätt eftersom GradientAscent fungerade. Med det problemet åtgärdat kunde jag enkelt lösa uppgiften genom att ändra fy och fx till negativa. 

Svara
Close