Vector wxmaxima 0.8.4:定义向量而不定义其分量

Vector wxmaxima 0.8.4:定义向量而不定义其分量,vector,maxima,dot-product,Vector,Maxima,Dot Product,让我们看看下面的代码 e1 : matrix([a1],[b1],[c1]); e2 : matrix([a2],[b2],[c2]); dotproduct(e1,e2); 第三行给出了输出 a1a2 + b1b2 +c1c2 我想换成这样(e是e的标准): 有没有一种方法可以为dotproduct函数提供一个简化的答案?这里有一个解决方案,尽管这并不完全令人满意 不要调用dotproduct,只需将dotproducts编写为a即可。b。(运算符在极大值中表示非对易乘法。)您可以定义简化

让我们看看下面的代码

e1 : matrix([a1],[b1],[c1]);
e2 : matrix([a2],[b2],[c2]);
dotproduct(e1,e2);
第三行给出了输出

a1a2 + b1b2 +c1c2
我想换成这样(
e
e
的标准):


有没有一种方法可以为dotproduct函数提供一个简化的答案?

这里有一个解决方案,尽管这并不完全令人满意

不要调用
dotproduct
,只需将dotproducts编写为
a即可。b
。(
运算符在极大值中表示非对易乘法。)您可以定义简化规则,以便
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
,还要定义
角度(a,b)
。这是Maxima的一个弱点——它对这些东西的报道是命中或未命中的

或者你不需要定义
norm
angle
——我想这取决于你的目的。也许你可以说更多关于你试图解决的更大的问题是什么

另外,这个解决方案有点问题,因为只有两个术语的产品
a。b
将匹配。有三个术语,
a。Bc
,模式匹配者认为它不合适。围绕这一点有各种各样的方法,同样,没有一种方法是完全令人满意的


尽管如此,我希望这对您有所帮助。

这里有一个解决方案,尽管这并不完全令人满意

不要调用
dotproduct
,只需将dotproducts编写为
a即可。b
。(
运算符在极大值中表示非对易乘法。)您可以定义简化规则,以便
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
,还要定义
角度(a,b)
。这是Maxima的一个弱点——它对这些东西的报道是命中或未命中的

或者你不需要定义
norm
angle
——我想这取决于你的目的。也许你可以说更多关于你试图解决的更大的问题是什么

另外,这个解决方案有点问题,因为只有两个术语的产品
a。b
将匹配。有三个术语,
a。Bc
,模式匹配者认为它不合适。围绕这一点有各种各样的方法,同样,没有一种方法是完全令人满意的


尽管如此,我希望这对您有所帮助。

我不需要同时定义范数和角度,而且我只有两项乘积,因此您的答案非常适合我的需要。只有一个问题:这个解决方案是否涵盖分布:如果我写(a+b).c,maxima会给出a.c+b.c吗?
(a+b)的简化。c
由全局标志
dotdistrib
控制。默认值为
false
。当
dotdistrib
true
时,
(a+b).c
简化为
a.c+b.c
。由于上述规则是由
tellsimpafter
定义的,因此在任何内置简化后都会应用该规则。因此,您将把规则应用于
a+b
c
,或者
a
c
b
c
,这取决于
dotdistrib
的值。我不需要同时定义范数和角度,而且我只有两个术语的乘积,所以您的答案非常适合我的需要。只有一个问题:这个解决方案是否涵盖分布:如果我写(a+b).c,maxima会给出a.c+b.c吗?
(a+b)的简化。c
由全局标志
dotdistrib
控制。默认值为
false
。当
dotdistrib
true
时,
(a+b).c
简化为
a.c+b.c
。由于上述规则是由
tellsimpafter
定义的,因此在任何内置简化后都会应用该规则。因此,您将把规则应用于
a+b
c
,或
a
c
b
c
,具体取决于
dotdistrib
的值。