我知道Matlab中的pol2cart
函数,但我不认为这是我想要的,或者我不知道如何使用它来让它返回我想要的东西。
假设您有以下向量:
例如,在Wolfram Mathematica中,您可以编写如下内容:
并返回上述矢量的笛卡尔坐标。
问题是:我如何在Matlab中实现这样的目标?如果我只需要处理数字并将其作为pol2cart
的输入就会容易得多,但是在这里我需要我的向量显示类似于TransformedField
函数的输出。
谢谢, 伊琳娜
答案 0 :(得分:2)
在Mathematica的操作中没有什么神奇之处。它只是利用change-of-basis between cylindrical and Cartesian coordinates。以下是使用符号变量执行类似操作的快速实现:
function vcar = cyl2car(vcyl)
%
% The elements of vcyl are expected to be order [v_r ; v_theta ; v_z] such that
% vcyl = v_r * rhat + v_theta * thetahat + v_z * zhat.
%
% The element of vcar will then be in the order: [v_x ; v_y ; v_z] such that
% vcar = v_x * xhat + v_y * yhat + v_z * zhat.
%
% For symbolic input, the expected symbolic symbols are [r,theta,z] for cylindrical
% and [x,y,z] for Cartesian.
%
% Declarations and change-of-basis
syms x y z r theta xhat yhat zhat rhat thetahat;
rhat = x/sqrt(x^2 + y^2) * xhat + y/sqrt(x^2 + y^2) * yhat;
thetahat = -y/sqrt(x^2 + y^2) * xhat + x/sqrt(x^2 + y^2) * yhat;
% Substitute and simplify
temp = simplify(subs(vcyl,[r,theta],[sqrt(x^2+y^2),atan(y/x)]));
temp = expand(sum(temp .* [rhat ; thetahat ; zhat]));
% Assign
vcar = sym(0)*vcyl;
[c,t] = coeffs(temp,[xhat,yhat,zhat]);
if (length(t)>=1)
vcar(1) = c(1);
end
if (length(t)>=2)
vcar(2) = c(2);
end
if (length(t)>=3)
vcar(3) = c(3);
end
end
返回与Mathematica类似的表达式:
>> vcyl = [0 ; sym(64)*sym(10^-7)*sym(pi)/(sym(2)*r) ; 0];
>> vcarsym = cyl2car(vcyl)
vcarsym =
-(pi*y)/(312500*(x^2 + y^2))
(pi*x)/(312500*(x^2 + y^2))
0