4 svar
906 visningar
enblivandeingenjör är nöjd med hjälpen
enblivandeingenjör 53 – Fd. Medlem
Postad: 15 feb 2019 13:49

Steepest Descent

Ska beräkna lokala extrempunkter till funktionen:

f=x13+0.3x12+3x1x2+0.9x23-x2

Använder steepest descent-metoden på -f med startapproximationen (-1,-1) för att hitta den maxpunkt som ligger nära (-1,-1).

Har fått en del hjälpkod som jag måste justera/lägga till i och sen avläsa vissa värden. Jag får inte själva koden att köra ens dock, är väldigt förvirrad. Infogar det jag har.


 

sd.m

 

 

function [x,fmin,k]=sd(f,x0,tol)

x=x0; kmax=750;

for k=1;kmax;

    grad=jacobi(f,x); 

    g=@(s)f(x-s*grad'); 

    alpha=fminbnd(g,0,1); 

    x=x-alpha*grad'; %stegar fram till nästa punkt

    if norm(alpha*grad)<tol, break, end 

end

fmin=f(x); 


 

jacobi.m

function A = jacobi(f,x)

h=1e-6; n=length(x);

for i=1:n

    x1=x; x1(i)=x1(i)+h;

    x2=x; x2(i)=x2(i)-h;

    A(:,i)=(f(x1)-f(x2))/(2*h);

end


 

f.m

function y = f(x)

y = x(1).^3+0.3*x(1).^2+3*x(1).*x(2)+0.9*x(2).^3-x(2);

......


Förstår inte hur alla dessa ska gå ihop, eller hur jag ska hämta min funktion f, i samtliga scripts får jag felmeddelanden för att input arguments saknas.

Laguna Online 28587
Postad: 15 feb 2019 21:34

Med din kod kan jag göra följande anrop:

f([1 2])

jacobi(@(x)f(x), [-1,-1])

sd(@(x)f(x), [-1,0], 0.5)

Om det blir det det ska vet jag inte, men det returneras tal. Fungerar de inte för dig?

enblivandeingenjör 53 – Fd. Medlem
Postad: 18 feb 2019 10:50

När jag kör allt individuellt i Command Window fungerar det. Däremot får jag endast ut två tal, men inte 'k'. Därför det känns som att något är fel. Samt att jag får följande felmeddelande när jag provar "Run" hela koden:

 

"

>> sd
Not enough input arguments.

Error in sd (line 36)
grad=jacobi(f,x); %beräknar gradienten
 "

Det får mig att tro att det är något just i den delen som är fel.

enblivandeingenjör 53 – Fd. Medlem
Postad: 18 feb 2019 12:59

"for k=1;kmax;"

Har angett semikolon häremellan istället för vanligt kolon. Efter denna justering går nu koden att köras.

Laguna Online 28587
Postad: 18 feb 2019 13:02

Man får samla de returnerade värdena i en vektor om man vill se alla:

[x, fmin, k] = sd(blabla)

Att bara skriva sd utan argument kan inte fungera, det är en funktion som behöver tre argument. 

Svara Avbryt
Close