Sharednum_grad - steilster Abstieg.ipynbOpen in CoCalc
format long
function f = rosenbrook(x)
    f = 100*(x(2) - x(1)*x(1))^2 + (1-x(1))^2;
endfunction
function f = wood(x)
    f = 100*(x(1)^2-x(2))^2 + (1-x(1))^2 + 90*(x(3)^2 - x(4))^2 + (1-x(3))^2 + 10.1*((1-x(2))^2+(1-x(4))^2)+19.8*(1-x(2))*(1-x(4));
endfunction
function k = fc(x)
n = length(x);
f = 0;
g = 0;
    for i = 1:n
        for j = 1:n
            f = (f + (1/(i+j-1))*x(i)*x(j));
        endfor
        g = (g + x(i));
    endfor
    k = (1/2)*(f-g);
endfunction
function f = fd(x)
n = length(x);
f = (x(1)-1)^2;
    for i = 2:n
        f = f + (x(i-1) - (1/2)*x(i))^2;
    endfor
endfunction
function g = num_grad(fname,x,e)
    f = feval(fname,x);
    n = length(x);
    for i=1:n             #Implementierung der Einheitsvektoren
        if(i == 1)
            einh = [1 zeros(1,n-1)];
        elseif(i==n)
            einh = [zeros(1,n-1) 1];
        else
            einh = [zeros(1,i-1) 1 zeros(1,n-i)];
        endif
        g(i) = (1/(2*e))*(feval(fname,x+e*einh)-feval(fname,x-e*einh)); #b(eps) aus VO wird definiert
    endfor
endfunction
function g = steilAbs(fname,xstart)
    # Startwerte für das steilste Abstieg Verfahren werden initialisiert
    status = -1;
    k = 0;
    x = xstart;
    s = -num_grad(fname,xstart,eps^(2/3));
    c = 1/10;
    while(status == -1) # Solange keine der Abrruchbedingungen erfüllt ist, bleibt Status auf -1
        # Bestimmung der Schrittweite ausgehend von l = 1
        l = 1;
        while(feval(fname,x+l*s)>(feval(fname,x)+l*c*(transpose((num_grad(fname,x,eps^(2/3)))))*s))
            l = l/2;
            # 1.Abbruchbedingung wird überprüft (zu kleine Schrittweite)
            if (l < 10^-5)
                status = 2;
            endif
         endwhile
         # 2.Abbruchbedingung wird überprüft (zu viele Iterationen)
         if(k>1000)
             status = 1;
         endif
         r = max((10^-3)*norm(num_grad(fname,xstart,eps^(2/3))),10^-10); # epsilon für Abbruchbedingung 3 wird definiert
         #Abbruchbedingung 3 wird überprüft (Minimumsbedingung)
         if(norm(num_grad(fname,x,eps^(2/3)))<=r)
             status = 0;
         endif
         # Ist keine der Abbruchbedingungen eingetreten, so werden x, s und k aktualisiert
         if(status == -1)
             x = x + l*s;
             s = -num_grad(fname,x,eps^(2/3));
             k = k+1;
         endif
         # Möglichkeit die Wert nach einer bestimmten Anzahl von Iterationen auszugeben
         if(mod(k,10)==1)
             z = [status, x];
         endif
    endwhile
    g = [status, x];
    k
    wert = feval(fname,x)
endfunction
rosenbrook([1.1,-1.2])
ans = 580.82
num_grad('rosenbrook',[1.1,-1.2],eps^(2/3))
ans = 1060.60 -482.00
steilAbs('rosenbrook',[1.1,-1.2])
k = 7 wert = 0.027039 ans = 0.00000 0.83620 0.70068
jacobs([1.1,-1.2], 'rosenbrook')
ans = 1060.60 -482.00
jacobs([1.1,-1.2,1,2], 'wood')
ans = 1060.60 -506.64 -360.00 156.64
num_grad('wood',[1.1,-1.2,1,2],eps^(2/3))
ans = 1060.59 -506.64 -360.00 156.64
jacobs([1,1,1,1,1],'fc')
ans = 1.78333 0.95000 0.59286 0.38452 0.24563
num_grad('fc',[1,1,1,1,1],eps^(2/3))
ans = 1.78333 0.94999 0.59285 0.38453 0.24563
jacobs([1,1,1,1,1,1,1,1,1,1],'fd')
ans = Columns 1 through 7: 1.00000 0.50000 0.50000 0.50000 0.50000 0.50000 0.50000 Columns 8 through 10: 0.50000 0.50000 -0.50000
num_grad('fd',[1,1,1,1,1,1,1,1,1,1],eps^(2/3))
ans = Columns 1 through 7: 1.00000 0.50000 0.50000 0.50000 0.50000 0.50000 0.50000 Columns 8 through 10: 0.50000 0.50000 -0.50000
steilAbs('wood',[1.1,-1.2,1,2])
k = 98 wert = 0.16537 ans = 0.00000 0.76133 0.57987 1.17682 1.38506
steilAbs('fc',[34,1,234,12,3])
k = 62 wert = 6.1529 ans = 0.00000 6.50388 -76.88942 160.40830 -48.49816 -44.67677
steilAbs('fd',[23,456,34,2,54,34,67,2,112,34])
k = 15 wert = 0.76078 ans = Columns 1 through 7: 0.00000 0.82642 0.74183 1.20137 1.76855 3.04513 5.40293 Columns 8 through 11: 10.21434 19.85070 39.30051 78.37373
steilAbs('fc',[1,1,1,1,1])
k = 1001 wert = -1.8871 ans = 1.00000 0.52623 0.88075 -11.22182 -1.59276 18.36475
function f = R(x)
    f = 0.5*(2/5)*(2/5)*sqrt(1 + ((0.96)/(2/5))^2 +  ((1.28)/(2/5))^2) + 0.5*(2/5)*(2/5)*sqrt(1 + ((1.28)-x/(2/5))^2 +  ((0.96)-x/(2/5))^2);
endfunction
steilAbs('R',[0])
k = 4 wert = 0.41187 ans = 0.00000 0.44796
R(0.41187)
ans = 0.41251
R(1)
ans = 0.50621