2011年10月01日 星期六 18:15
我觉得你没有搞清楚leastsq所调用的residual函数的作用。你再好好对照一下书中的实例:
http://hyry.dip.jp:8000/scipybook/default/file/03-scipy/scipy_least_square_sin.py
2011年10月04日 星期二 15:51
这个例子看过很多遍,但是遇到新的例子总是拿不准 args=()中的参数,希望斑竹多加指点,感谢先!
2011年10月04日 星期二 16:45
leastsq()的args参数是传递给residual()的额外参数, residual()的第一个参数是待定系数列表,其后的参数就是leastsq()的args参数。
如果你对这种参数传递不熟悉的话,那么最好不用它。在residual()中直接访问全局变量即可。
2011年10月04日 星期二 20:32
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
Ref = np.arange(0,10,0.1)
def func(x,p):
A1,A2,A3,A4 = p
Linear = A1*Ref
Poly = A2+A3*x+A4*x**2
return Linear+Poly
def residual(p, y, x):
return y - func(x,p)
noise = np.random.randn(len(Ref))
Exp = Ref*5.0 + noise
n = len(Ref)
x = np.linspace(1, n, n)
p0 = [5.0, 0, 0, 0 ]
y0 = func(x,p0)
plsq = leastsq(residual, p0, args=(Exp, x))
pl.figure()
pl.plot(x, y0, label="Original")
pl.plot(x, func(x, plsq[0]), label="Best Fit")
pl.legend()
版主看了你的说明问题解决了,如果多项式阶数越高系数越多就比较麻烦了。请教斑竹如何把def func() 中的Poly 改成多项式阶数可变的形式,我的想法如下
def func(x,p):
A1,Coeff,deg = p
Coeff = np.polyfit(x, Ref, deg)
Fity = np.polyval(Coeff, x)
return A1*Ref+Fity
但是定义初始值时 p0 = [1.93, Coeff0, deg],错误 ValueError: setting an array element with a sequence.
2011年10月05日 星期三 12:27
我觉得你只需要用np.polyval()就可以了。用np.polyval([A4, A3, A2], x)可以快速计算:
A2+A3*x+A4*x**2
所以func可以写为:
def func(x,p):
return np.polyval(p[:0:-1], x) + p[0]*Ref
2011年10月05日 星期三 19:38
斑竹说的正是我所需要的,但是我提到的polyfit就是想省去 定义多项式阶数的麻烦,直接用degree=n就能实现想要的高阶多项式。按你的思路,比如:
def func(x,p):
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 = p # 能否简化此定义,类似degree=n直接指定阶数???
return np.polyval(p[:0:-1], x) + p[0]*Ref
2011年10月05日 星期三 19:54
没明白什么意思,你不需要运行A1,A2,...,A10 = p 啊。
2011年10月05日 星期三 23:37
我明白np.polyval(p[:0:-1], x) 的意思了, 十分感谢斑竹!!!!!!!!!!!!!!
Zeuux © 2024
京ICP备05028076号