我想在三维笛卡尔坐标系中绘制极坐标r
和theta
的二维函数。我有(抱歉数学格式不好,LaTeX不兼容,似乎)
f(r,theta) = r/2 * (cos(theta - pi/4) + sqrt(1 + 1/2 * cos(2*theta)))
将r
和theta
转换为笛卡尔坐标
x = r * cos(theta), y = r * sin(theta)
此外,该域名为-1<r<1
和0<theta<2 * pi
,我通过
r = -1:2/50:1;
和
theta = 0:2*pi/50:2*pi;
给我两个相同尺寸的矢量。
我可以通过
定义用于绘制为行向量的x
和y
值
x = r. * cos(theta);
和
y = r. * sin(theta);
所以现在我需要定义z
值,这取决于x
和y
的值。我想我应该制作一个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>]
图1。表面不正确。
图2。正确的表面。
答案 0 :(得分:1)
正如其他人所说,你可以使用meshgrid
来完成这项工作。
以下是使用网格化r
和theta
的示例以及用于替换双循环的匿名函数:
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
来获取矩阵坐标。转到x
和y
(小写),请致电
[X,Y] = meshgrid(x,y);
然后X
和Y
(大写)将具有与您给出的值相同的值,但是按照surf
的预期在二维数组中布局。在这里循环索引并计算Z
,all(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
}
});
。