Maxima样条曲线结果不会在循环中更改

时间:2014-05-07 12:35:59

标签: maxima

我正在尝试迭代2个参数以获得每对的两个样条线。代码:

y_arr:[0.2487,0.40323333333333,0.55776666666667,0.7123]$
str_h_arr:[-0.8,-1.0,-1.2,-1.4]$
z_points:[0,0.1225,0.245,0.3675,0.49,0.6125,0.735,0.8575,0.98,1.1025,1.225,1.3475,1.47,
1.5925,1.715,1.8375,1.96,2.0825,2.205,2.26625,2.3275,2.3765,2.401,2.4255,2.43775,
2.4451,2.448775,2.45]$
length(a)$
length(b)$
load(interpol)$
for y_k:1 thru length(a) do (
    for h_k:1 thru length(b) do (
        y:y_arr[y_k],
        str_h:str_h_arr[h_k],
        bot_startpoints: [[-2.45,0],[0,y],[2.45,0]],
        top_startpoints: [[-2.45,str_h_min],[0,y+str_h],[2.45,str_h_min]],
        spline: cspline(bot_startpoints),
        bot(x):=''spline,

        print(bot(0))
    )
);

//跳过带顶部样条线的零件。

对于所有迭代,输出现在都是相同的:0.7123 我想得到的是两个样条曲线,如图example of spline y_arr的成员是x = 0,str_h_arr中的y值:x = 0中样条线之间的高度。 所以bot(0)应该给我y_arr的所有值。 如果我不使用循环并只给出y_k和h_k的块值,它就能正常工作。 任何人都可以指出我在使用cspline循环时我(或Maxima)的错误吗?

1 个答案:

答案 0 :(得分:2)

问题在于引号引用(两个单引号'')仅在输入中读取时应用一次;每次在循环中计算表达式时都不会应用它。

看起来您只需要在x = 0处评估样条曲线而不需要其他任何内容。所以我建议ev(spline, x=0)来评估它。您还可以构造一个lambda表达式并对其进行评估。

以上是我按照上述说明对其进行修改后的程序。此外,编写for y in y_arr do (...)而不是使用y_arr的显式索引更简单,更清晰。

y_arr:[0.2487,0.40323333333333,0.55776666666667,0.7123]$
str_h_arr:[-0.8,-1.0,-1.2,-1.4]$
z_points:[0,0.1225,0.245,0.3675,0.49,0.6125,0.735,0.8575,0.98,1.1025,1.225,1.3475,1.47,
1.5925,1.715,1.8375,1.96,2.0825,2.205,2.26625,2.3275,2.3765,2.401,2.4255,2.43775,
2.4451,2.448775,2.45]$
load(interpol)$
for y in y_arr do (
  for str_h in str_h_arr do (
    bot_startpoints: [[-2.45,0],[0,y],[2.45,0]],
    top_startpoints: [[-2.45,str_h_min],[0,y+str_h],[2.45,str_h_min]],
    spline: cspline(bot_startpoints),
    print (ev (spline, x=0))));

这是我得到的输出:

0.2487 
0.2487 
0.2487 
0.2487 
0.40323333333333 
0.40323333333333 
0.40323333333333 
0.40323333333333 
0.55776666666667 
0.55776666666667 
0.55776666666667 
0.55776666666667 
0.7123 
0.7123 
0.7123 
0.7123