【问题标题】:scipy.optimize.curve_fit a definite integral function with scipy.integrate.quadscipy.optimize.curve_fit 与 scipy.integrate.quad 的定积分函数
【发布时间】:2018-09-06 16:29:49
【问题描述】:

如果我有一个函数,自变量是数学模型的定积分的上限。这个数学模型有我想做回归的参数。 这个数学模型是非线性的,可能很复杂。

  1. 我该如何解决这个问题?

  2. 如果我的函数的输出再被处理,可以是curve_fit吗?

有一个简化的案例

import scipy.optimize as sp
from scipy.integrate import quad
import numpy as np
number = 100

def f(x,a,b,c):
    return 500*a*x+b*c

def curvefit(d,a,b,c):
    return quad(f,0,d,args=(a,b,c))[0]

x_linear = np.linspace(0.001,0.006,number)
y_linear = 23.33*x_linear + 0.02*(np.random.random(number)-0.5)
parameter = sp.curve_fit(curvefit,x_linear,y_linear)

x 和 y _linear 是我编的数。

curvefit() 中的

d 现在是 x_linear,它是一个列表,并且是 quad() 中的上限。

错误显示ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我知道 quad() 要求上限为浮点数。

【问题讨论】:

标签: python numpy math scipy curve-fitting


【解决方案1】:

在函数 scipy.integrate.quad 内部引发错误,因为 d 是 numpy.array 而不是标量。赋予scipy.optimize.curve_fit 的函数将自变量(在您的情况下为x_linear)作为第一个参数。

快速而肮脏的解决方法是修改curvefit以计算d中每个值的定积分:

def curvefit(xs,a,b,c):
    return [quad(f,0,x,args=(a,b,c))[0] for x in xs]

【讨论】:

  • 非常感谢您的回答。报 TypeError 错误:'numpy.float64' object is not iterable now。我单独将代码分开,效果很好,但是使用原始行 scipy.optimize.curve_fit(curvefit,x_linear,y_linear) 会显示此错误。
  • 你能用你实际运行的代码更新问题吗?
  • 请忽略我之前的评论,我犯了一个愚蠢的错误。它运作良好。谢谢!
猜你喜欢
  • 2019-11-13
  • 2019-12-04
  • 2018-12-20
  • 1970-01-01
  • 2016-01-12
  • 2018-11-22
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多