我写了一个程序,首先计算逆拉普拉斯变换,然后计算最小二乘,最后应该最小化这些平方和。不幸的是,我得到了这个错误:
Traceback (most recent call last):
File "C:/program.py", line 46, in <module>
LSQminsearch(f, TF, 0.5, 0.5, 0.5, 0.5)
File "C:/program.py", line 36, in LSQminsearch
res = optimize.fmin(f, [k0, dzeta0, tau0, tauz0], maxiter = 100000000, maxfun=1000000)
File "C:\Users\xyz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\scipy\optimize\optimize.py", line 443, in fmin
res = _minimize_neldermead(func, x0, args, callback=callback, **opts)
File "C:\Users\xyz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\scipy\optimize\optimize.py", line 586, in _minimize_neldermead
fsim[k] = func(sim[k])
File "C:\Users\xyz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\sympy\core\expr.py", line 325, in __float__
raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float
我的代码是:
import pandas as pd
from sympy import symbols, inverse_laplace_transform, sympify
from scipy import optimize
dane = pd.read_fwf('data11.txt', header=None)
dane.columns = ['time', 'response']
T = dane['time']
Yt = dane['response']
t = symbols('t', positive=True, real=True)
s, k, tauz, tau, dzeta = symbols('s k tauz tau dzeta', real=True)
F = (k * ((tauz*s + 1)/((tau**2)*(s**2) + 2*tau*dzeta*s + 1)))
print('Calculating Inverse Laplace')
IL = inverse_laplace_transform(F, s, t)
TF = sympify(IL)
LSQ = 0
print('Calculating least squares')
for i in range(len(T)):
LSQl = Yt[i]
LSQp = TF.subs({'t': T[i]})
LSQk = (LSQl - LSQp)**2
LSQ = LSQ + LSQk
LSQ = sympify(LSQ)
def f(params):
return LSQ.subs({'k': params[0], 'dzeta': params[1], 'tau': params[2], 'tauz': params[3]})
def LSQminsearch(f, TF, k0, dzeta0, tau0, tauz0):
print(f'Searching for minimum for k0= {k0} dzeta0= {dzeta0} tau0= {tau0} tauz0= {tauz0} ...')
res = optimize.fmin(f, [k0, dzeta0, tau0, tauz0], maxiter = 100000000, maxfun=1000000)
k = res[0]
dzeta = res[1]
tau = res[2]
tauz = res[3]
print(f'Found k0= {k} dzeta0= {dzeta} tau0= {tau} tauz0= {tauz} ...')
LSQminsearch(f, TF, 0.5, 0.5, 0.5, 0.5)
我已经看到了一些关于这个的其他问题,但大多数问题是混合了数学函数的名称空间,但我在代码中没有看到这一点。我不能在这里发布data11.txt中的数据,因为它的字符太多,所以这里是:https://justpaste.it/6vwwl
您需要的更改:
f
应返回浮点值所以你应该试试这个:
相关问题 更多 >
编程相关推荐