如何在符号变量中插入数值?
How to insert numerical values in symbolical variables?
我想计算具有符号值的旋转矩阵。之后应插入一些数值并显示结果。如何用 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”..
你非常接近。您需要将多个变量封装在 cell 数组中,而不是数值数组。将 []
替换为 {}
。另外,请确保将 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
小记(感谢horchler)
从MATLAB R2012a+开始,不需要再用{}
封装变量了。您可以正常使用 []
,因为这更符合 MuPAD 版本的 subs
的工作方式。
我想计算具有符号值的旋转矩阵。之后应插入一些数值并显示结果。如何用 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”..
你非常接近。您需要将多个变量封装在 cell 数组中,而不是数值数组。将 []
替换为 {}
。另外,请确保将 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
小记(感谢horchler)
从MATLAB R2012a+开始,不需要再用{}
封装变量了。您可以正常使用 []
,因为这更符合 MuPAD 版本的 subs
的工作方式。