Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在符号变量中插入数值?_Matlab_Symbolic Math - Fatal编程技术网

Matlab 如何在符号变量中插入数值?

Matlab 如何在符号变量中插入数值?,matlab,symbolic-math,Matlab,Symbolic Math,我想用符号值计算一个旋转矩阵。之后,应插入一些数值并显示结果。如何使用matlab实现这一点?我试过“subs”,但它不能计算sin/cos syms d t1 t2 t3; M01 = [cos(t1) 0 -sin(t1) 0;sin(t1) 0 cos(t1) 0;0 -1 0 d;0 0 0 1]; M12 = [cos(t2) -sin(t2) 0 0;sin(t2) cos(t2) 0 0;0 0 1 -10;0 0 0 1]; M23 = [1 0 0 30;0 1 0 0 ;0

我想用符号值计算一个旋转矩阵。之后,应插入一些数值并显示结果。如何使用matlab实现这一点?我试过“subs”,但它不能计算sin/cos

syms d t1 t2 t3;
M01 = [cos(t1) 0 -sin(t1) 0;sin(t1) 0 cos(t1) 0;0 -1 0 d;0 0 0 1];
M12 = [cos(t2) -sin(t2) 0 0;sin(t2) cos(t2) 0 0;0 0 1 -10;0 0 0 1];
M23 = [1 0 0 30;0 1 0 0 ;0 0 1 0;0 0 0 1];
M34 = [cos(t3) -sin(t3) 0 0 ;sin(t3) cos(t3) 0 0 ;0 0 1 10;0 0 0 1];
M45 = [1 0 0 30;0 1 0 0 ;0 0 1 0;0 0 0 1];
disp('Transformation Matrix between S0 to S5 is:');
M05 = M01*M12*M23*M34*M45
disp('position of the end-effector with respect to base is:');
subs(M05,[t1 t2 t3 d],[degtorad(45) degtorad(-75) degtorad(130) 70])

我只想得到这个表达式的数值,但matlab中的工作区显示为“4x4 sym”。

您非常接近。您需要将多个变量封装在单元格数组中,而不是数字数组中。将
[]
替换为
{}
。另外,请确保将
subs
回调的结果分配给某个对象。。。因此,在您的情况下,再次使用
M05

>> M05 = subs(M05,{t1,t2,t3,d},{degtorad(45),degtorad(-75),degtorad(130),70});

M05 =

[ (2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4))/2 + (2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4))/2, (2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4))/2 - (2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4))/2, -2^(1/2)/2, 15*2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4) - 15*2^(1/2)*(2^(1/2)/4 - 6^(1/2)/4) + 15*2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4)]
[ (2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4))/2 + (2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4))/2, (2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4))/2 - (2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4))/2,  2^(1/2)/2, 15*2^(1/2)*cos((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4) - 15*2^(1/2)*(2^(1/2)/4 - 6^(1/2)/4) + 15*2^(1/2)*sin((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4)]
[                         sin((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4) - cos((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4),                       - cos((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4) - sin((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4),          0,               (15*2^(1/2))/2 - 30*cos((5*pi)/18)*(2^(1/2)/4 + 6^(1/2)/4) + (15*6^(1/2))/2 + 30*sin((5*pi)/18)*(2^(1/2)/4 - 6^(1/2)/4) + 70]
[                                                                                                       0,                                                                                                       0,          0,                                                                                                                                          1]
然而,这仍然是符号格式。如果需要数值结果,只需将
M05
转换为
double

>> M05 = subs(M05,{t1 t2 t3 d},{degtorad(45) degtorad(-75) degtorad(130) 70});
>> M05 = double(M05)

M05 =

    0.4056   -0.5792   -0.7071   17.6578
    0.4056   -0.5792    0.7071   17.6578
   -0.8192   -0.5736         0   74.4032
         0         0         0    1.0000

小纸条(感谢霍奇勒)
由于MatlabR2012A+,您不需要使用
{}
来封装变量。您可以正常使用
[]
,因为这更符合MuPAD版本的
subs
的工作方式。

谢谢,casting to double为我完成了这项工作!它甚至可以和[]一起工作,不过……仅供参考,在R2012a+中,方括号现在对
subs
有效。看见这就是工作原理。@horchler-谢谢。我习惯于用
{}
来调用它,但没有意识到可以使用
[]