我正在尝试迭代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
我想得到的是两个样条曲线,如图
y_arr
的成员是x = 0,str_h_arr
中的y值:x = 0中样条线之间的高度。
所以bot(0)应该给我y_arr的所有值。
如果我不使用循环并只给出y_k和h_k的块值,它就能正常工作。
任何人都可以指出我在使用cspline循环时我(或Maxima)的错误吗?
答案 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