Steepest Descent
Ska beräkna lokala extrempunkter till funktionen:
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.
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?
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.
"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.
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.