将矢量从圆柱转换为笛卡尔Matlab

时间:2017-05-28 09:14:10

标签: matlab vector coordinates wolfram-mathematica

我知道Matlab中的pol2cart函数,但我不认为这是我想要的,或者我不知道如何使用它来让它返回我想要的东西。

假设您有以下向量:

here

例如,在Wolfram Mathematica中,您可以编写如下内容:

this

并返回上述矢量的笛卡尔坐标。

问题是:我如何在Matlab中实现这样的目标?如果我只需要处理数字并将其作为pol2cart的输入就会容易得多,但是在这里我需要我的向量显示类似于TransformedField函数的输出。

谢谢, 伊琳娜

1 个答案:

答案 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