Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: NopT-Projekt
Views: 38
Kernel: Octave
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