如何在 MATLAB 中绘制(冲浪)矢量化(矩阵形)方程?

How to plot (surf) vectorized (Matrix shaped) equation in MATLAB?

我想要surf这个功能:

z=w.'*p %(close form)

其中:

w=[w0; w1]
p=[cte0; cte1]

其中,w是可变的,cte0和cte1可以是任意数字。 要使用 surf 我们需要通过 meshgrid:

生成 w0 和 w1
[w0,w1]=meshgrid(-50:1:50)

现在我们只能通过将等式(z=w.'*p)操作为这种形式来得到答案:

z=w0*cte0+w1*cte1 %(open form)
surf(z)

我不想操纵我的方程式,因为在其他情况下,更大的方程式不太容易操纵它们。 除了符号工具箱之外,还有什么方法可以简单地以这种紧密形式到达表面吗?

所以,假设您从 "close form" 方程式开始 anonymous function:

z = @(w) w.'*p;

假定 p 已经定义并且需要一个 2×1 的输入。 MATLAB 中的任何高级绘图例程(例如 fsurf)如何知道输入应该是 2×1(即一组自变量 [x; y])?他们不会,除非你像这样把这个函数包装在另一个函数中:

fxy = @(x, y) z([x; y]);

因此,此函数需要两个变量作为输入,并将它们连接起来并以正确的形式将它们传递给函数 z。但是函数 fxy 将如何处理 xy 的向量或矩阵输入?不太好,所以我们必须添加另一层包装来处理这个问题(由 arrayfun 提供):

fxyMat = @(x, y) arrayfun(fxy, x, y);

现在你有一个函数,它接受两个变量的向量或矩阵输入,并最终计算你原始的、未改变的方程。您现在可以使用 fsurf 绘制它,而无需自己在多个点明确评估它(基本上,您让 fsurf 为您完成):

p = [1; 2];
z = @(w) w.'*p;
fxy = @(x, y) z([x; y]);
fxyMat = @(x, y) arrayfun(fxy, x, y);
fsurf(fxyMat, [-50 50]);

这是情节(对于这个例子来说只是一个简单的倾斜平面):

[w0,w1] = meshgrid(-50:1:50) ;

cte0 = rand ;
cte1 = rand ;
p = [repmat(cte0,size(w0)) ; repmat(cte1,size(w1))] ;
w = [w0 ; w1] ;
Z = w.*p ;