2016-03-24 70 views
0

在maxima中,是否有以下行爲意圖?在Maxima中使用聲明(var,constant)的副作用

第一個例子:

(%i1) declare(a,constant); 
(%o1)        done 
(%i2) constantp(a); 
(%o2)        true 
(%i3) square(a):=a^2; 

define: in definition of square, found bad argument a 
-- an error. To debug this try: debugmode(true); 
(%i4) load("linearalgebra.mac"); 

define: in definition of dotproduct, found bad argument a 
-- an error. To debug this try: debugmode(true); 

第二個例子:

(%i1) a:5; 
(%o1)         5 
(%i2) constantp(a); 
(%o2)        true 
(%i3) square(a):=a^2; 
               2 
(%o3)       square(a) := a 
(%i4) square(a); 
(%o4)         25 

第三個例子:

(%i1) declare(a,scalar); 
(%o1)        done 
(%i2) mat_f(a,b):=a.b - b.a; 
(%o2)     mat_f(a, b) := a . b - b . a 
(%i4) mat_f(matrix([1,2],[3,4]),matrix([3,4],[1,2])); 
           [ - 10 - 14 ] 
(%o4)       [   ] 
           [ 6  10 ] 

好像declare(a,constant)有這對我的極大似乎很奇怪一個全球性的影響。第二個和第三個例子完全按照我期望的方式工作。

也有類似的情況下,像這樣的事情發生在最大值?

回答

1

千里馬有一個非常弱的範圍概念。基本上所有的符號都在相同的範圍內,所以當你做出關於a的聲明時,它是關於a的所有實例,甚至是那些函數參數的實例。

千里馬其實是一個非常古老的程序,這是從未更新過的方面之一。有人討論給Maxima一個更強的範圍概念,但這需要一些時間。

+0

因此,無論何時加載像'linearalgebra.mac'這樣的包,我必須檢查其函數定義中使用的變量的源代碼?或者在進行任何聲明之前確保在程序開始時加載它就足夠了?我經常使用函數而不顯式加載包,這樣有點不方便。 – kalix

+0

可能最好的方法是在聲明之前加載你需要的包。這當然不是很令人滿意,因爲它只是必要的,因爲Maxima無法區分不同範圍的符號。 –