如何使用MATLAB在三维空间中绘制二维函数?

时间:2017-02-07 16:33:35

标签: matlab matlab-figure

我想在三维笛卡尔坐标系中绘制极坐标rtheta的二维函数。我有(抱歉数学格式不好,LaTeX不兼容,似乎)

f(r,theta) = r/2 * (cos(theta - pi/4) + sqrt(1 + 1/2 * cos(2*theta)))

rtheta转换为笛卡尔坐标

x = r * cos(theta), y = r * sin(theta)

此外,该域名为-1<r<10<theta<2 * pi,我通过

定义
r = -1:2/50:1;

theta = 0:2*pi/50:2*pi;

给我两个相同尺寸的矢量。

我可以通过

定义用于绘制为行向量的xy
x = r. * cos(theta);

y = r. * sin(theta);

所以现在我需要定义z值,这取决于xy的值。我想我应该制作一个101x101,其中每个矩阵元素包含最终曲面的数据点。但是我该怎么做呢?我考虑过使用双for循环:

for i=1:numel(r)
    for j=1:numel(theta)
        z(i,j) = r(i)/2 .* cos(theta(j) - pi/4) + r(i).*sqrt(1 + 1/2 * cos(2.*theta(j)));
    end
end

然后只需surf(z)

虽然这肯定给了我一个表面,它给了我不正确的表面!我不知道这里发生了什么。图1中给出了不正确的表面,而图2中给出了正确的表面。任何人都可以帮助我吗?作为参考,使用

使用GeoGebra绘制正确的表面
A = Function[<expression 1>, <Expresison 2>, <Expression 3>, <var 1>, <start>, <stop>, <var 2>, <start>, <stop>]

Incorrect surface

图1。表面不正确。

Correct surface

图2。正确的表面。

2 个答案:

答案 0 :(得分:1)

正如其他人所说,你可以使用meshgrid来完成这项工作。

以下是使用网格化rtheta的示例以及用于替换双循环的匿名函数:

r = -1:2/50:1;
theta = 0:2*pi/50:2*pi;

% define anonymous function f(r,theta)
f =  @(r,theta) r/2 .* (cos(theta - pi/4) + sqrt(1 + 1/2 .* cos(2.*theta)));

% generate grids for r and theta
[r, theta] = meshgrid(r,theta); 
% calculate z from gridded r and theta
z = f(r,theta); 

% convert r,theta to x,y and plot with surf
x = r.*cos(theta); 
y = r.*sin(theta);
surf(x,y,z);

答案 1 :(得分:0)

如果您想使用meshgrid,则需要使用surf来获取矩阵坐标。转到xy(小写),请致电

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

然后XY(大写)将具有与您给出的值相同的值,但是按照surf的预期在二维数组中布局。在这里循环索引并计算Zall(size(Z) == size(X))应该有// service import Ember from 'ember'; const { Service, inject: { service }, computed, run, set, get } = Ember; export default Service.extend({ ajax: service(), usingJQueryAjax() { let data = $.get('/api/data').then(function(result ) { console.log("right here: ", result ); return result; }); return data } });

https://www.mathworks.com/help/matlab/ref/meshgrid.html