Fmin无法将表达式转换为浮点

2024-06-25 07:18:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个程序,首先计算逆拉普拉斯变换,然后计算最小二乘,最后应该最小化这些平方和。不幸的是,我得到了这个错误:

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


Tags: inpytflineresfileoptimizetau
1条回答
网友
1楼 · 发布于 2024-06-25 07:18:28

您需要的更改:

  1. 您应该将符号替换为数字,而不是将字符串替换为数字
  2. 函数f应返回浮点值

所以你应该试试这个:

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]})   # <  use t, not 't'
    LSQk = (LSQl - LSQp)**2
    LSQ = LSQ + LSQk

LSQ = sympify(LSQ)

def f(params):
    # use symbols, not string
    # eval to float, be careful about complex number
    re, im = LSQ.subs({k: params[0], dzeta: params[1], tau: params[2], tauz: params[3]}).evalf().as_real_imag()
    return re

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)

相关问题 更多 >