[已解决] 再问关于matlab符号计算化简

[复制链接]
wrathzhong 发表于 2014-2-23 21:45:36
首先感谢winner245上次的解答,在式子少的时候化简可以用,但是我在计算中遇到了下面的问题:
delt =

E*H*e*k*t - E*H*e*m*s - E*R*e*k*w + E*Q*e*m*w - H*b*d*g*m + H*b*e*f*m - H*b*d*g*t + H*b*e*f*t + A*b*e*m*w - B*b*d*m*w - H*b*d*m*t + H*b*e*m*s + R*b*d*g*w - R*b*e*f*w - Q*b*e*m*w + R*b*d*m*w + G*H*d*g*i*k - G*H*e*f*i*k + G*H*d*g*i*s - G*H*e*f*i*s - A*G*e*i*k*w + B*G*d*i*k*w + G*H*d*i*k*t - G*H*e*i*k*s - G*H*d*g*m*x + G*H*e*f*m*x - G*Q*d*g*i*w + G*Q*e*f*i*w - G*H*d*g*t*x + G*H*e*f*t*x + G*Q*e*i*k*w - G*R*d*i*k*w + A*G*e*m*w*x - B*G*d*m*w*x - G*H*d*m*t*x + G*H*e*m*s*x - H*c*d*g*k*q + H*c*e*f*k*q + G*R*d*g*w*x - G*R*e*f*w*x + H*c*d*g*m*p - H*c*e*f*m*p - F*b*d*g*m*w + F*b*e*f*m*w - G*Q*e*m*w*x + G*R*d*m*w*x + H*c*d*g*p*t - H*c*d*g*q*s - H*c*e*f*p*t + H*c*e*f*q*s + A*c*e*k*q*w - B*c*d*k*q*w - A*c*e*k*t*u - A*c*e*m*p*w + B*c*d*k*t*u + B*c*d*m*p*w + A*c*e*m*s*u - B*c*d*m*s*u - H*c*e*k*p*t + H*c*e*k*q*s + H*c*d*m*p*t - H*c*d*m*q*s + R*c*d*g*k*u - R*c*e*f*k*u - Q*c*d*g*m*u + Q*c*e*f*m*u + Q*c*d*g*q*w - Q*c*e*f*q*w - R*c*d*g*p*w + R*c*e*f*p*w - Q*c*d*g*t*u + Q*c*e*f*t*u + R*c*d*g*s*u - R*c*e*f*s*u - Q*c*e*k*q*w + R*c*e*k*p*w + Q*c*d*m*q*w + Q*c*e*k*t*u - R*c*d*m*p*w - R*c*e*k*s*u - Q*c*d*m*t*u + R*c*d*m*s*u + F*G*d*g*i*k*w - F*G*e*f*i*k*w - F*G*d*g*m*w*x + F*G*e*f*m*w*x - F*c*d*g*k*q*w + F*c*e*f*k*q*w + F*c*d*g*k*t*u + F*c*d*g*m*p*w - F*c*e*f*k*t*u - F*c*e*f*m*p*w - F*c*d*g*m*s*u + F*c*e*f*m*s*u

>> assume(d*g==e*f);
>> assume(m*x==i*k);
>> assume(p*t==q*s);
>> assume(k*t==m*s);
>> assume(k*q==m*p);
>> s=simplify(delt)

s =

e*m*(E*Q*w - E*H*s + A*b*w + H*b*s - Q*b*w + A*G*w*x + G*H*s*x - G*Q*w*x + A*c*s*u) - d*m*(B*b*w + H*b*t - R*b*w + B*G*w*x + G*H*t*x - G*R*w*x + B*c*s*u + Q*c*t*u - R*c*s*u) - e*k*(E*R*w - E*H*t + A*G*i*w + G*H*i*s - G*Q*i*w + A*c*t*u - Q*c*t*u + R*c*s*u) + d*k*(B*G*i*w + G*H*i*t - G*R*i*w + B*c*t*u) + c*e*k*q*(H*s - Q*w) + c*d*k*q*(H*t - R*w) - c*d*m*q*(H*s - Q*w) - c*e*k*p*(H*t - R*w)

>> s=expand(s)

s =

E*H*e*k*t - E*H*e*m*s - E*R*e*k*w + E*Q*e*m*w + A*b*e*m*w - B*b*d*m*w - H*b*d*m*t + H*b*e*m*s - Q*b*e*m*w + R*b*d*m*w - A*G*e*i*k*w + B*G*d*i*k*w + G*H*d*i*k*t - G*H*e*i*k*s + G*Q*e*i*k*w - G*R*d*i*k*w + A*G*e*m*w*x - B*G*d*m*w*x - G*H*d*m*t*x + G*H*e*m*s*x - G*Q*e*m*w*x + G*R*d*m*w*x - A*c*e*k*t*u + B*c*d*k*t*u + A*c*e*m*s*u - B*c*d*m*s*u + H*c*d*k*q*t - H*c*e*k*p*t + H*c*e*k*q*s - H*c*d*m*q*s - Q*c*e*k*q*w - R*c*d*k*q*w + R*c*e*k*p*w + Q*c*d*m*q*w + Q*c*e*k*t*u - R*c*e*k*s*u - Q*c*d*m*t*u + R*c*d*m*s*u


可以明显的看到s的第一项和第二项“E*H*e*k*t - E*H*e*m*s ”可以在 assume(k*t==m*s)的条件下化简为0,为什么matlab没有自动处理

最佳答案


kaaaf123 发表于 2014-2-28 18:34:50
对同一个变量做新的假设需要用assumeAlso
assume(d*g==e*f);
assume(m*x==i*k);
assume(p*t==q*s);
assumeAlso(k*t==m*s);
assumeAlso(k*q==m*p);

s = expand(simplify(det(matrix)))

6 条回复


winner245 发表于 2014-2-23 22:19:59
你最好提供完整的代码,包括从最初的定义开始,这样别人能复制你的代码来运行

wrathzhong 发表于 2014-2-24 08:59:08
完整的代码如下,是计算一个符号矩阵行列式值的化简
>> syms E b c d e f g x i k m u s p q t w p1y1 A Q B R F H G
matrix=[1 1 1 0 0 0 0 0 0 0;0 0 0 1 1 1 0 0 0 0;E b 0 0 0 0 G c 0 0;d 0 0 e 0 0 0 0 0 0;f 0 0 g 0 0 0 0 -1 0;0 x 0 0 i 0 -1 0 0 0;0 k 0 0 m 0 0 0 -1 0;0 0 p 0 0 q 0 -1 0 u;0 0 s 0 0 t 0 0 -1 w;A 0 Q B 0 R 0 0 F H]


matrix =

[ 1, 1, 1, 0, 0, 0,  0,  0,  0, 0]
[ 0, 0, 0, 1, 1, 1,  0,  0,  0, 0]
[ E, b, 0, 0, 0, 0,  G,  c,  0, 0]
[ d, 0, 0, e, 0, 0,  0,  0,  0, 0]
[ f, 0, 0, g, 0, 0,  0,  0, -1, 0]
[ 0, x, 0, 0, i, 0, -1,  0,  0, 0]
[ 0, k, 0, 0, m, 0,  0,  0, -1, 0]
[ 0, 0, p, 0, 0, q,  0, -1,  0, u]
[ 0, 0, s, 0, 0, t,  0,  0, -1, w]
[ A, 0, Q, B, 0, R,  0,  0,  F, H]

>> delt=det(matrix)

delt =

E*H*e*k*t - E*H*e*m*s - E*R*e*k*w + E*Q*e*m*w - H*b*d*g*m + H*b*e*f*m - H*b*d*g*t + H*b*e*f*t + A*b*e*m*w - B*b*d*m*w - H*b*d*m*t + H*b*e*m*s + R*b*d*g*w - R*b*e*f*w - Q*b*e*m*w + R*b*d*m*w + G*H*d*g*i*k - G*H*e*f*i*k + G*H*d*g*i*s - G*H*e*f*i*s - A*G*e*i*k*w + B*G*d*i*k*w + G*H*d*i*k*t - G*H*e*i*k*s - G*H*d*g*m*x + G*H*e*f*m*x - G*Q*d*g*i*w + G*Q*e*f*i*w - G*H*d*g*t*x + G*H*e*f*t*x + G*Q*e*i*k*w - G*R*d*i*k*w + A*G*e*m*w*x - B*G*d*m*w*x - G*H*d*m*t*x + G*H*e*m*s*x - H*c*d*g*k*q + H*c*e*f*k*q + G*R*d*g*w*x - G*R*e*f*w*x + H*c*d*g*m*p - H*c*e*f*m*p - F*b*d*g*m*w + F*b*e*f*m*w - G*Q*e*m*w*x + G*R*d*m*w*x + H*c*d*g*p*t - H*c*d*g*q*s - H*c*e*f*p*t + H*c*e*f*q*s + A*c*e*k*q*w - B*c*d*k*q*w - A*c*e*k*t*u - A*c*e*m*p*w + B*c*d*k*t*u + B*c*d*m*p*w + A*c*e*m*s*u - B*c*d*m*s*u - H*c*e*k*p*t + H*c*e*k*q*s + H*c*d*m*p*t - H*c*d*m*q*s + R*c*d*g*k*u - R*c*e*f*k*u - Q*c*d*g*m*u + Q*c*e*f*m*u + Q*c*d*g*q*w - Q*c*e*f*q*w - R*c*d*g*p*w + R*c*e*f*p*w - Q*c*d*g*t*u + Q*c*e*f*t*u + R*c*d*g*s*u - R*c*e*f*s*u - Q*c*e*k*q*w + R*c*e*k*p*w + Q*c*d*m*q*w + Q*c*e*k*t*u - R*c*d*m*p*w - R*c*e*k*s*u - Q*c*d*m*t*u + R*c*d*m*s*u + F*G*d*g*i*k*w - F*G*e*f*i*k*w - F*G*d*g*m*w*x + F*G*e*f*m*w*x - F*c*d*g*k*q*w + F*c*e*f*k*q*w + F*c*d*g*k*t*u + F*c*d*g*m*p*w - F*c*e*f*k*t*u - F*c*e*f*m*p*w - F*c*d*g*m*s*u + F*c*e*f*m*s*u

>> assume(d*g==e*f);
>> assume(m*x==i*k);
>> assume(p*t==q*s);
>> assume(k*t==m*s);
>> assume(k*q==m*p);
>> s=simplify(delt)

s =

e*m*(E*Q*w - E*H*s + A*b*w + H*b*s - Q*b*w + A*G*w*x + G*H*s*x - G*Q*w*x + A*c*s*u) - d*m*(B*b*w + H*b*t - R*b*w + B*G*w*x + G*H*t*x - G*R*w*x + B*c*s*u + Q*c*t*u - R*c*s*u) - e*k*(E*R*w - E*H*t + A*G*i*w + G*H*i*s - G*Q*i*w + A*c*t*u - Q*c*t*u + R*c*s*u) + d*k*(B*G*i*w + G*H*i*t - G*R*i*w + B*c*t*u) + c*e*k*q*(H*s - Q*w) + c*d*k*q*(H*t - R*w) - c*d*m*q*(H*s - Q*w) - c*e*k*p*(H*t - R*w)

>> s=expand(s)

s =

E*H*e*k*t - E*H*e*m*s - E*R*e*k*w + E*Q*e*m*w + A*b*e*m*w - B*b*d*m*w - H*b*d*m*t + H*b*e*m*s - Q*b*e*m*w + R*b*d*m*w - A*G*e*i*k*w + B*G*d*i*k*w + G*H*d*i*k*t - G*H*e*i*k*s + G*Q*e*i*k*w - G*R*d*i*k*w + A*G*e*m*w*x - B*G*d*m*w*x - G*H*d*m*t*x + G*H*e*m*s*x - G*Q*e*m*w*x + G*R*d*m*w*x - A*c*e*k*t*u + B*c*d*k*t*u + A*c*e*m*s*u - B*c*d*m*s*u + H*c*d*k*q*t - H*c*e*k*p*t + H*c*e*k*q*s - H*c*d*m*q*s - Q*c*e*k*q*w - R*c*d*k*q*w + R*c*e*k*p*w + Q*c*d*m*q*w + Q*c*e*k*t*u - R*c*e*k*s*u - Q*c*d*m*t*u + R*c*d*m*s*u

>>

wrathzhong 发表于 2014-2-27 19:32:59
有没有哪位高手帮看看这个程序的问题所在,为什么做了相应的等式假设而在实际化简的过程中确没有完全按照假设的化简

wrathzhong 发表于 2014-2-28 18:20:20
最近做这个东西挺着急的,哪位老师、高手了解的请赐教,谢谢。

kaaaf123 发表于 2014-2-28 18:34:50
对同一个变量做新的假设需要用assumeAlso
assume(d*g==e*f);
assume(m*x==i*k);
assume(p*t==q*s);
assumeAlso(k*t==m*s);
assumeAlso(k*q==m*p);

s = expand(simplify(det(matrix)))

回复此楼

wrathzhong 发表于 2014-2-28 21:44:28
非常感谢kaaaf123的解答,也感谢winner245的帮助和其他朋友的意见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表