我们有以下代码
e1 : matrix([a1],[b1],[c1]);
e2 : matrix([a2],[b2],[c2]);
dotproduct(e1,e2);
第3行给出输出
a1a2 + b1b2 +c1c2
我希望有类似的东西(|e|
是e
的标准):
|e1||e2|
wxMaxima是否有办法为dotproduct函数提供简化的答案?
答案 0 :(得分:0)
这是一个解决方案,虽然这并不完全令人满意。
不要只调用dotproduct
,而只需将点积写为a . b
。 (.
运算符表示Maxima中的非交换乘法。)您可以定义简化规则,以便a . b
简化为涉及a
和b
的表达式以及它们之间的角度。
matchdeclare ([aa, bb], nonscalarp);
tellsimpafter (aa . bb, norm(aa)*norm(bb)*cos(angle(aa, bb)));
有了这个,我得到:
(%i12) declare ([e1, e2], nonscalar);
(%o12) done
(%i13) e1.e2;
(%o13) norm(e1)*cos(angle(e1,e2))*norm(e2)
也许这很有帮助,你可以说它是否有用。它不是那么好,因为您必须自己定义norm
并angle(a, b)
。这是千里马的一个弱点 - 它对这些东西的报道很受欢迎。
或者您可能不需要定义norm
和angle
- 我想这取决于您的目的。也许你可以说更多关于你试图解决的更大问题。
此外,此解决方案有点问题,因为只有两个术语的产品a . b
才匹配。使用三个术语a . b . c
,模式匹配器认为它不合适。有各种各样的方法,再一次,没有一个完全令人满意。
同样,我希望这对你有用。