正如评论中提到的@Karl,您必须来回分配变量和数组。以下解决方案似乎以自动化方式工作,但我不确定这是否真的是一种简化。如果您想从 更改p
为q
或从 3 个变量更改为 7 个变量,也许它会让生活变得更轻松。它使用了一些不那么明显的“技巧”,检查help arrays
, help macros
, help evaluate
, help keyentry
, help sum
, help sprintf
, ...
代码:
### workaround for fitting using array values
reset session
$Data <<EOD
# x y
0 0.0222457
0.1 0.113168
0.2 0.252268
0.3 0.378091
0.4 0.397219
0.5 0.577536
0.6 0.621418
0.7 0.695817
0.8 0.741057
0.9 0.849566
1 0.864276
EOD
# parameters and fitting curve
N = 3
array p[N]
p[1] = 1.3 ; p[2] = 0.2 ; p[3] = 0.7
myVar = 'p' # define your variable
myColX = 1
myColY = 2
f(x) = p1 * sin( p2 + p3 * x ) # fitting function, defined with p1, p2, p3, ..., pN
#=======
# from here on "everything" goes automatic with variables and arrays
print "Initial array values: ", @myVar
# defining procedures for assigning variables and/arrays back and forth
myArrToVar(var) = sprintf("do for [i=1:|%s|] { eval(sprintf('%s%s = %s[%s]',i,i)) }",var,var,'%d',var,'%d')
myVarToArr(var) = sprintf("do for [i=1:|%s|] { eval(sprintf('%s[%s] = %s%s',i,i)) }",var,var,'%d',var,'%d')
# values from array --> variables
ArrToVar = myArrToVar(myVar)
@ArrToVar
# create the via, e.g p1,p2,p3,...
myViaStr(var) = (_tmp = '', (sum[_i=1:N] (_tmp = _tmp.sprintf('%s%d%s',var,_i,_i==N?'':', '),1)), _tmp)
viaStr = myViaStr(myVar)
# actual fitting
set fit quiet nolog
fit f(x) $Data using myColX:myColY via @viaStr
# values from variables --> array
VarToArr = myVarToArr(myVar)
@VarToArr
print "Final array values: ", @myVar
set key top left
plot $Data u myColX:myColY w p pt 7 ti "Data", \
f(x) w l lc "red", \
for [i=1:N] keyentry ti sprintf('%s[%d]=%.4f',myVar,i,@myVar[i])
### end of code
结果:
Initial array values: [1.3,0.2,0.7]
Final array values: [0.9215500294371,0.0231339564404058,1.20450770853891]
