Matlab & Mathematica 解符号方程组

Matlab & Mathematica 求解方程组:

Matlab:

解方程

syms a1 b1 c1
syms a2 b2 c2
syms x y

[x,y] = solve( 'a1*x + b1*y + c1 == 0', 'a2*x + b2*y + c2 == 0', 'x','y')
simplify(x)
simplify(y)

三点求齐次变换矩阵

syms a1 a2 b1 b2 c1 c2;
syms x1 y1 z1 A1 B1 C1; %原点坐标
syms dzx dzy; % 向量[dzx dzy 1]
vx = [a1,b1,c1];
Nx = norm(vx);
v2 = [a2,b2,c2];
vz = cross(vx,v2)
Nz = norm(vz);
vy = cross(vz,vx)
Ny = norm(vy);
mat = [
    a1/Nx vy(1)/Ny vz(1)/Nz x1;
    b1/Nx vy(2)/Ny vz(2)/Nz y1;
    c1/Nx vy(3)/Ny vz(3)/Nz z1;
    0     0        0        1
];

%% 随便计算验证一下
p1 = [1 2 3 1.1 1 1.3]; % 原点
p2 = [2 3 6 1.1 1 1.2]; % x轴上任意一点
p3 = [5 3 7 1.1 1 1.0]; % x-y平面任意一点

p21 = p2-p1;
p31 = p3-p1;
re = subs(mat, {a1,b1,c1,a2,b2,c2,x1,y1,z1},{p21(1),p21(2),p21(3),  p31(1),p31(2),p31(3),  p1(1),p1(2),p1(3)})
R = re(1:3,1:3);
R*R'; % 单位矩阵
tra = vpa(re,5);  % 获得数值矩阵
tra*[0 0 0 1]' % 将坐标系1下的原点转换到坐标系0,即得到p1

如果需要用实际数值替换某个符号变量,使用 subs 函数,或者 对符号变量赋值,然后使用 eval 函数。

Mathematica:

解方程

sol = Solve[ a1*x + b1*y + c1 == 0 && a2*x + b2*y + c2 == 0, {x,y}]
// 因为 MMA 计算结果是一个Rule:{x->xxx , y->xxx},因此需要利用这个Rule得到解,/.表示全部应用规则,例如:f[x_]:=x+1+y,即出现x的地方用x+1+y替换。
x/.sol
y/.sol
在 MMA 中如果需要将结果进一步计算,可应用规则:
f[x,y]/.sol
Simplify[%]
// 将表达式转化为C/C++语言格式
CForm[%]

你可能感兴趣的:(matlab,&,mathematica)