使用值数组作为输入获取函数的结果数组(在 Matlab 中)

Get an array of results of a function using as input an array of values (in Matlab)

我想使用值数组作为输入来获取函数的结果数组。该函数接收两个变量 (x1, x2) 和一个常量 x3,因此我尝试使用网格在一个范围内输入它的所有组合。

结果不正确,我遗漏了一些东西。

样本:

fun = @(x1,x2,x3) (x2-x1^2)^2+(1-x1)^2 + x3;
x3 = 7;
fun2 = @(x) fun(x(1,1),x(1,2),x3);

x0 = [2 3];
min = fminsearch(fun2, x0);
disp(min);

x = min(1)-10:1:min(1)+10;
y = min(2)-10:1:min(2)+10;

[X,Y] = meshgrid(x,y);

% I'm getting strange values here, like z < 0, how it is possible if everything is squared in the function.
Z = fun(X,Y,x3);

重要的是要注意 matrix and element-wise operations in MATLAB 之间存在差异。

矩阵运算是通过普通运算符定义的,例如 *^。因此,例如,A*BAB 之间执行矩阵乘法。

逐元素运算符在运算符之前使用点 .,即 .*.^ 等。因此,A.*B 执行 AB 的逐元素乘法。此操作的最终结果是一个与 AB 大小相同的数组(其大小必须相等),其中数组的第 jj 个元素等于 A(jj)*B(jj).

现在,考虑您对 fun 的定义:

fun = @(x1,x2,x3) (x2-x1^2)^2+(1-x1)^2 + x3;

当 MATLAB 计算这个表达式时会发生什么,它将矩阵运算应用到输入数组,例如 ^。但是,要获得将操作应用于输入数组 x1x2 中每个单独元素的预期结果,您应该使用逐元素操作。

新定义

fun = @(x1,x2,x3) (x2-x1.^2).^2+(1-x1).^2 + x3;

应该提供所需的结果。