如何将复杂的复发从clojure转换为maxima?

时间:2014-05-21 20:53:01

标签: clojure maxima

我认为这个小程序:

(defn average [lst] (/ (reduce + lst) (count lst)))
(defn sqsum [lst] (reduce + (map #(* % %) lst)))


(defn tet [row col]
  (cond (= [row col] [0 0]) 0
        (= [row col] [1 0]) 1
        (< row (inc col)) 0
        (> row (inc col)) (average (for [i (range row)] (tet i col)))
        (= row (inc col)) (Math/sqrt (- 1 (sqsum (for [i (range col)] (tet row i)))))))

给出了各种维度的广义四面体/欧几里德单形顶点的坐标。

不幸的是,clojure会以浮点形式表达sqrt(3/4)之类的东西,而我喜欢符号形式的答案。

Maxima对于这类事情是理想的,但我不知道如何在maxima中表达这种关系。

或者,涉及向clojure添加符号平方根的解决方案也很不错。

3 个答案:

答案 0 :(得分:2)

在Maxima中,memoizing函数由f[x, y] := ...定义,即使用方括号而不是参数的括号。

据我所知,这是Clojure函数的翻译:

average (lst) := apply ("+", lst) / length (lst);
sqsum (lst) := apply ("+", map (lambda ([x], x^2), lst));

tet [row, col] :=
  if row < col + 1 then 0
  else if row > col + 1 then average (makelist (tet [i, col], i, 0, row - 1))
  else if row = col + 1 then sqrt (1 - sqsum (makelist (tet [row, i], i, 0, col - 1)));

tet [0, 0] : 0;
tet [1, 0] : 1;

E.g:

radcan (tet[4, 3]);
 => sqrt(5)/2^(3/2)

radcan (tet[7, 6]);
 => 2/sqrt(7)

第一个人同意上面的a[4, 3]。 Dunno关于第二个。

答案 1 :(得分:1)

这是业务

a[0,0]:0;
a[1,0]:1;

for row:2 while row<=15 do (
    (col:(row-1)),
    for r:0 while r<=col do (a[r,col]:0),
    for c:0 while c<col do (a[row,c]:(sum(a[i,c],i,0,row-1))/row),
    a[row,col]:radcan(sqrt(1-sum(a[row,c]^2,c,0,col-1))),
    disp(a[row,col]^2));

但是无论如何将它表达为原始递归并记忆它以便它在有限的时间内运行?

答案 2 :(得分:0)

我已经手工完成了前几个&#39;在极大,像这样,如果有人需要灵感。 (这是2d迭代,相当于上面的递归(曾经被记忆))

所以我想我现在的问题可能是如何将其表达为最大值的for循环&#39;

一个单工

a[0,0]:0;

a[1,0]:1;

双单形(等边三角形)

a[0,1]:0;

a[1,1]:0;

a[2,0]:(a[0,0]+a[1,0])/2;

a[2,1]:sqrt(1-a[2,0]^2);

三单纯形(四面体)

a[0,2]:0;

a[1,2]:0;

a[2,2]:0;

a[3,0]:(a[0,0]+a[1,0]+a[2,0])/3;

a[3,1]:(a[0,1]+a[1,1]+a[2,1])/3;

a[3,2]:sqrt(1-a[3,0]^2-a[3,1]^2);

四单纯形(四面体)

col:3;

a[0,col]:0;

a[1,col]:0;

a[2,col]:0;

a[3,col]:0;

col:0;

a[4,col]:(a[0,col]+a[1,col]+a[2,col]+a[3,col])/4;

col:1;

a[4,col]:(a[0,col]+a[1,col]+a[2,col]+a[3,col])/4;

col:2;

a[4,col]:(a[0,col]+a[1,col]+a[2,col]+a[3,col])/4;

a[4,3]:sqrt(1-a[4,0]^2-a[4,1]^2-a[4,2]^2);

radcan(%);