2016-11-23 5 views
1

Ich versuche plotten rosenbrock functionWie Rosenbrock- Funktion in Matlab

Rosenbrock Function

wie diese

clear; clc; close all; 
% Parameters 
nx = 2;     % No. of Input variables 
f = @rosenbrock; 
limits = repmat([-10 10], nx, 1); 
titl = 'Rosenbrock'; 

% Plot 
[X,Y] = meshgrid(linspace(limits(1,1),limits(1,2),100),... 
       linspace(limits(2,1),limits(2,2),100)); 

Z = reshape(f([X(:)'; Y(:)']), 100, 100); 

surfc(X,Y,Z); 

rosenbrock.m

function [y] = rosenbrock(x) 
    xn = circshift(x',1)'; 
    xn(1) = 0; 
    y = sum(100*(xn - x.^2).^2 + (x - 1).^2); 
end 

ich die Implementierung über Funktion kennen zu zeichnen ist nicht richtig. Mit der Schleife kann es leicht gemacht werden, aber mit der Vektorisierung bekomme ich falsche Ergebnisse. Kann jeder Körper helfen?

Rosenbrock

Antwort

0

Die vektorisierte Version von rosenbrock function wäre -

sum(100*(xx(2:end) - xx(1:end-1).^2).^2 + (xx(1:end-1)-1).^2) 

Probelauf -

% Input array 
>> xx 
xx = 
    5  1  3  9  2  8  5  9  1  4 

% Loopy implementation 
>> d = length(xx); 
sum1 = 0; 
for ii = 1:(d-1) 
    xi = xx(ii); 
    xnext = xx(ii+1); 
    new = 100*(xnext-xi^2)^2 + (xi-1)^2; 
    sum1 = sum1 + new; 
end 
y = sum1; 
>> y 
y = 
    1698514 

% Vectorized implementation 
>> sum(100*(xx(2:end) - xx(1:end-1).^2).^2 + (xx(1:end-1)-1).^2) 
ans = 
    1698514 
+0

mit Ihrem Code, erhalte ich diesen Fehler während Funktion umformen aufrufen. 'Um die Anzahl der Elemente zu RESHAPE darf nicht ändern. –

+0

@KarenJohnson Nun, ich benutze nicht' Umformen'. Ich bin mir also nicht sicher, wie Sie meinen Code verwenden. Außerdem gehe ich davon aus, dass die Funktion einen Skalar ausgibt, genau wie bei der Schleifenimplementierung. – Divakar

+0

@KarenJohnson Ist der verknüpfte Loopy-Code in Ihrem Fall anwendbar? Warum teilen Sie nicht den Code, der für Sie funktioniert, dann können wir ihn vektorisieren? – Divakar