curve_fit多变量阵列非线性回归

发布于 2025-02-06 18:09:33 字数 2810 浏览 2 评论 0原文

我正在尝试使用curve_fit拟合多元函数的系数。所有变量均为以下形状的数组:(1000)手动我可以按以下方式拟合曲线。首先,我定义函数,其中变量= [dphi1,dphi2,phi1,phi2,m],并且系数= [c1,c2,c3,c4,c4,c5,c5,c6,c7,c8,c9]:

    import numpy as np 
    import matplotlib.pyplot as plt
    import tensorflow as tf
    import math
    
    # Function definition
    def ddphi1(dphi1,dphi2,phi1,phi2,M,c1,c2,c3,c4,c5,c6,c7,c8,c9):
        return (-(c1*np.sin(phi1-phi2)*np.cos(phi1-phi2)*dphi1**2)-(c2*np.sin(phi1-phi2)*dphi2**2)+(c3*np.cos(phi1-phi2)*np.sin(phi2))+(c4*np.cos(phi1-phi2)*(dphi2-dphi1))-(c5*np.sin(phi1))+c6*M-c7*dphi1)/(c8-(c9*np.cos(phi1-phi2)*np.cos(phi1-phi2))) 

我的第一个预测系数的第一个预测:

p = [0.5625, 0.375, 27.590625000000003, 0.09375, 55.18125, 62.5, 0.425, 1, 0.5625]

我迭代地计算函数的值。我占用所有变量的长度已经具有相同的大小:

n = len(time1)
y = np.empty(n)

for i in range(n):
    y[i] = ddphi1(dphi11[i],dphi22[i],phi11[i],phi22[i],M[i],p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8])

plt.plot(time1, ddphi11)
plt.plot(time1, y, 'r')

现在想法是用curve_fit自动计算系数:** ddphi1 ist我的回调函数和ddphi11我的形状数据(1000)以及其他变量

from scipy.optimize import curve_fit

g = [0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56]

c,cov =curve_fit(ddphi1,(dphi1,dphi2,phi1,phi2,M),ddphi11,g)
print(c)

,我收到了这个错误,

--------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-158-e8e42e7b1216> in <module>()
      1 from scipy.optimize import curve_fit
      2 
----> 3 c,cov =curve_fit(ddphi1,(dphi1,dphi2,phi1,phi2,M),ddphi11,g=[0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56])
      4 print(c)

1 frames
/usr/local/lib/python3.7/dist-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    719         # non-array_like `xdata`.
    720         if check_finite:
--> 721             xdata = np.asarray_chkfinite(xdata, float)
    722         else:
    723             xdata = np.asarray(xdata, float)

/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in asarray_chkfinite(a, dtype, order)
    484 
    485     """
--> 486     a = asarray(a, dtype=dtype, order=order)
    487     if a.dtype.char in typecodes['AllFloat'] and not np.isfinite(a).all():
    488         raise ValueError(

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (5,) + inhomogeneous part.

我已经看到大多数数据,进入curve_fir在表单列表中。也许在处理数组时有一个解决方案? Espero我希望您能为我提供帮助,因为我是Python的新手。

I am trying to fit the coefficients of a multivariate function with curve_fit. All variables are arrays of the following shape : (1000,) Manually I can fit the curves as follows. First I define my function where the variables = [dphi1,dphi2,phi1,phi2,M] and the coefficients = [c1,c2,c3,c4,c5,c6,c7,c8,c9]:

    import numpy as np 
    import matplotlib.pyplot as plt
    import tensorflow as tf
    import math
    
    # Function definition
    def ddphi1(dphi1,dphi2,phi1,phi2,M,c1,c2,c3,c4,c5,c6,c7,c8,c9):
        return (-(c1*np.sin(phi1-phi2)*np.cos(phi1-phi2)*dphi1**2)-(c2*np.sin(phi1-phi2)*dphi2**2)+(c3*np.cos(phi1-phi2)*np.sin(phi2))+(c4*np.cos(phi1-phi2)*(dphi2-dphi1))-(c5*np.sin(phi1))+c6*M-c7*dphi1)/(c8-(c9*np.cos(phi1-phi2)*np.cos(phi1-phi2))) 

my first prediction of the coefficients:

p = [0.5625, 0.375, 27.590625000000003, 0.09375, 55.18125, 62.5, 0.425, 1, 0.5625]

I calculate the values of the function iteratively. I take the length of any of the variables already have the same size:

n = len(time1)
y = np.empty(n)

for i in range(n):
    y[i] = ddphi1(dphi11[i],dphi22[i],phi11[i],phi22[i],M[i],p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8])

plt.plot(time1, ddphi11)
plt.plot(time1, y, 'r')

Predicted Vs real data

Now the idea is to calculate the coefficients automatically with curve_fit as follows: ** ddphi1 ist my Callback function and ddphi11 my data of shape (1000,) as well as the other variables

from scipy.optimize import curve_fit

g = [0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56]

c,cov =curve_fit(ddphi1,(dphi1,dphi2,phi1,phi2,M),ddphi11,g)
print(c)

and I receive this error

--------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-158-e8e42e7b1216> in <module>()
      1 from scipy.optimize import curve_fit
      2 
----> 3 c,cov =curve_fit(ddphi1,(dphi1,dphi2,phi1,phi2,M),ddphi11,g=[0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56])
      4 print(c)

1 frames
/usr/local/lib/python3.7/dist-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    719         # non-array_like `xdata`.
    720         if check_finite:
--> 721             xdata = np.asarray_chkfinite(xdata, float)
    722         else:
    723             xdata = np.asarray(xdata, float)

/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in asarray_chkfinite(a, dtype, order)
    484 
    485     """
--> 486     a = asarray(a, dtype=dtype, order=order)
    487     if a.dtype.char in typecodes['AllFloat'] and not np.isfinite(a).all():
    488         raise ValueError(

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (5,) + inhomogeneous part.

I have seen that most of the data that goes into the curve_fir is in the form list. Maybe there is a solution when dealing with arrays? espero I hope you can help me as I am new to Python.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最冷一天 2025-02-13 18:09:33

我终于能够解决它。只有阵列应在全局变量

x = np.column_stack([DPHI11,DPHI22,PHI11,PHI22,M])

中描述基于全局变量的模型

def model(X,c1,c2,c3,c4,c5,c6,c7,c8,c9):
  dphi1 = X[:,0]
  dphi2 = X[:,1]
  phi1 = X[:,2]
  phi2 = X[:,3]
  M = X[:,4]

  f = (-(c1*np.sin(phi1-phi2)*np.cos(phi1-phi2)*dphi1**2)-(c2*np.sin(phi1-phi2)*dphi2**2)+(c3*np.cos(phi1-phi2)*np.sin(phi2))+(c4*np.cos(phi1-phi2)*(dphi2-dphi1))-(c5*np.sin(phi1))+c6*M-c7*dphi1)/(c8-(c9*np.cos(phi1-phi2)*np.cos(phi1-phi2)))
  return f

,魔术开始

guesses = [0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56]

from scipy.optimize import curve_fit

popt, pcov = curve_fit(model, X, ddphi11, guesses)
print(popt)

I was finally able to solve it. only the arrays should have been concatenated in a global variable

X=np.column_stack([dphi11,dphi22,phi11,phi22,M])

Then describe the model in based the global variable

def model(X,c1,c2,c3,c4,c5,c6,c7,c8,c9):
  dphi1 = X[:,0]
  dphi2 = X[:,1]
  phi1 = X[:,2]
  phi2 = X[:,3]
  M = X[:,4]

  f = (-(c1*np.sin(phi1-phi2)*np.cos(phi1-phi2)*dphi1**2)-(c2*np.sin(phi1-phi2)*dphi2**2)+(c3*np.cos(phi1-phi2)*np.sin(phi2))+(c4*np.cos(phi1-phi2)*(dphi2-dphi1))-(c5*np.sin(phi1))+c6*M-c7*dphi1)/(c8-(c9*np.cos(phi1-phi2)*np.cos(phi1-phi2)))
  return f

and the magic begins

guesses = [0.56, 0.37, 27.63, 0.094, 55.18, 62.5, 0.625, 1, 0.56]

from scipy.optimize import curve_fit

popt, pcov = curve_fit(model, X, ddphi11, guesses)
print(popt)

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文