简体   繁体   English

如何在matlab中绘制rosenbrock函数

[英]How to plot rosenbrock function in matlab

I'm trying to plot rosenbrock function 我正在尝试绘制rosenbrock function

Rosenbrock Function Rosenbrock功能

like this 像这样

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

I know the above function implementation is not correct. 我知道上面的函数实现不正确。 With loop it can be easily done, but with vectorization I'm getting wrong results. 使用循环可以很容易地完成,但是使用矢量化我得到了错误的结果。 Can any body help. 可以任何身体帮助。

Rosenbrock 的ROSENBROCK

The vectorized version of rosenbrock function would be - rosenbrock function的矢量化版本将是 -

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

Sample run - 样品运行 -

% 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM