使用 Maxima 进行循环
For loop with Maxima
for i:1 thru 3 step 1 do;
posix:arithsum(li*cos(ri(t))),1,i-1)+(li*cos(ri(t))/2);
posiy:arithsum(li*sin(ri(t))),1,i-1)+(li*sin(ri(t))/2);
我想做的是获得 6 个位置函数(3 x 和 3 y)。它应该给我如下值:
pos1x:l1*cos(r1(t))/2;
pos2x:l1*cos(r1(t))+l2*cos(r2(t))/2;
pos3x:l1*cos(r1(t))+l2*cos(r2(t))+l3*cos(r3(t))/2;
那么,为什么我的代码不起作用?
这里有几件事。 (1) for
循环只以一个表达式作为循环体;通常将多个表达式合并为一个 (e1, e2, e3)
或 block(e1, e2, e3)
。请注意,for ... do;
不是正确的语法,因为它没有循环体——分号终止了 for
表达式。还要注意正文中的表达式是用逗号分隔的,而不是分号。 (2) 可以使用下标符号对条目进行索引; Maxima 不会自动构造符号名称,例如 pos1x
。相反,使用下标表示法:posx[1]
、posy[i]
等
鉴于此,这里有一个解决方案。
(%i1) load (functs);
(%o1) /Applications/Maxima.app/Contents/Resources/opt/share/maxima/5.41.0/shar\
e/simplification/functs.mac
(%i2) for i:1 thru 3 step 1 do
(posx[i]:arithsum(l[i]*cos(r[i](t)),1,i-1)+(l[i]*cos(r[i](t))/2),
posy[i]:arithsum(l[i]*sin(r[i](t)),1,i-1)+(l[i]*sin(r[i](t))/2));
(%o2) done
(%i3) [posx[1], posx[2], posx[3]];
l cos(r (t)) 3 l cos(r (t)) l cos(r (t))
1 1 2 2 1 3 3
(%o3) [-------------, ---------------, 2 (l cos(r (t)) + -) + -------------]
2 2 3 3 2 2
(%i4) [posy[1], posy[2], posy[3]];
l sin(r (t)) 3 l sin(r (t)) l sin(r (t))
1 1 2 2 1 3 3
(%o4) [-------------, ---------------, 2 (l sin(r (t)) + -) + -------------]
2 2 3 3 2 2
我猜 l[i]
和 r[i]
也应该下标。我更改了括号以解决语法问题;如果您另有打算,当然可以继续修改。
请注意,在此公式中,posx
和 posy
是所谓的未声明数组。未声明的数组适合表示带下标的符号变量。您可以通过 listarray
.
获取元素列表
for i:1 thru 3 step 1 do;
posix:arithsum(li*cos(ri(t))),1,i-1)+(li*cos(ri(t))/2);
posiy:arithsum(li*sin(ri(t))),1,i-1)+(li*sin(ri(t))/2);
我想做的是获得 6 个位置函数(3 x 和 3 y)。它应该给我如下值:
pos1x:l1*cos(r1(t))/2;
pos2x:l1*cos(r1(t))+l2*cos(r2(t))/2;
pos3x:l1*cos(r1(t))+l2*cos(r2(t))+l3*cos(r3(t))/2;
那么,为什么我的代码不起作用?
这里有几件事。 (1) for
循环只以一个表达式作为循环体;通常将多个表达式合并为一个 (e1, e2, e3)
或 block(e1, e2, e3)
。请注意,for ... do;
不是正确的语法,因为它没有循环体——分号终止了 for
表达式。还要注意正文中的表达式是用逗号分隔的,而不是分号。 (2) 可以使用下标符号对条目进行索引; Maxima 不会自动构造符号名称,例如 pos1x
。相反,使用下标表示法:posx[1]
、posy[i]
等
鉴于此,这里有一个解决方案。
(%i1) load (functs);
(%o1) /Applications/Maxima.app/Contents/Resources/opt/share/maxima/5.41.0/shar\
e/simplification/functs.mac
(%i2) for i:1 thru 3 step 1 do
(posx[i]:arithsum(l[i]*cos(r[i](t)),1,i-1)+(l[i]*cos(r[i](t))/2),
posy[i]:arithsum(l[i]*sin(r[i](t)),1,i-1)+(l[i]*sin(r[i](t))/2));
(%o2) done
(%i3) [posx[1], posx[2], posx[3]];
l cos(r (t)) 3 l cos(r (t)) l cos(r (t))
1 1 2 2 1 3 3
(%o3) [-------------, ---------------, 2 (l cos(r (t)) + -) + -------------]
2 2 3 3 2 2
(%i4) [posy[1], posy[2], posy[3]];
l sin(r (t)) 3 l sin(r (t)) l sin(r (t))
1 1 2 2 1 3 3
(%o4) [-------------, ---------------, 2 (l sin(r (t)) + -) + -------------]
2 2 3 3 2 2
我猜 l[i]
和 r[i]
也应该下标。我更改了括号以解决语法问题;如果您另有打算,当然可以继续修改。
请注意,在此公式中,posx
和 posy
是所谓的未声明数组。未声明的数组适合表示带下标的符号变量。您可以通过 listarray
.