Python 复杂数据的曲线拟合

Python 复杂数据的曲线拟合,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我想用两个共享相同参数的函数来拟合复杂的数据集。为此我用了 def funcReal(x,a,b,c,d): return np.real((a + 1j*b)*(np.exp(1j*k*x - kappa1*x) - np.exp(kappa2*x)) + (c + 1j*d)*(np.exp(-1j*k*x - kappa1*x) - np.exp(-kappa2*x))) def funcImag(x,a,b,c,d): return np.imag((a + 1j*b)

我想用两个共享相同参数的函数来拟合复杂的数据集。为此我用了

def funcReal(x,a,b,c,d):
    return np.real((a + 1j*b)*(np.exp(1j*k*x - kappa1*x) - np.exp(kappa2*x)) + (c + 1j*d)*(np.exp(-1j*k*x - kappa1*x) - np.exp(-kappa2*x)))

def funcImag(x,a,b,c,d):
    return np.imag((a + 1j*b)*(np.exp(1j*k*x - kappa1*x) - np.exp(kappa2*x)) + (c + 1j*d)*(np.exp(-1j*k*x - kappa1*x) - np.exp(-kappa2*x)))`

poptReal, pcovReal = curve_fit(funcReal, x, yReal)
poptImag, pcovImag = curve_fit(funcImag, x, yImag)
这里,
funcReal
是我模型的实部,
funcImag
是虚部,
yReal
是数据的实部,
yImag
是数据的虚部

然而,这两种拟合并没有为实部和虚部提供相同的参数


我的问题是,是否有一个软件包或方法可以实现多个数据集和多个具有共享参数的函数的多重拟合?

要拟合上述两个复函数,我们可以将实部和虚部视为坐标点或向量。由于
curve\u fit
不关心数据点插入向量
x
(独立数据)和
y
(从属数据)的顺序,我们可以简单地分割复杂数据,并使用
hstack
堆叠实部和虚部。请参见下面的示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

kappa1 = np.pi
kappa2 = -0.01

def long_function(x, a, b, c, d):
    return (a + 1j*b)*(np.exp(1j*k*x - kappa1*x) - np.exp(kappa2*x)) + (c + 1j*d)*(np.exp(-1j*k*x - kappa1*x) - np.exp(-kappa2*x))

def funcBoth(x, a, b, c, d):
    N = len(x)
    x_real = x[:N//2]
    x_imag = x[N//2:]
    y_real = np.real(long_function(x_real, a, b, c, d))
    y_imag = np.imag(long_function(x_imag, a, b, c, d))
    return np.hstack([y_real, y_imag])

# Create an independent variable with 100 measurements
N = 100
x = np.linspace(0, 10, N)
# True values of the dependent variable
y = long_function(x, a=1.1, b=0.3, c=-0.2, d=0.23)
# Add uniform complex noise (real + imaginary)
noise = (np.random.rand(N) + 1j * np.random.rand(N) - 0.5 - 0.5j) * 0.1
yNoisy = y + noise

# Split the measurements into a  real and imaginary part
yReal = np.real(yNoisy)
yImag = np.imag(yNoisy)
yBoth = np.hstack([yReal, yImag])

# Find the best-fit solution
poptBoth, pcovBoth = curve_fit(funcBoth, np.hstack([x, x]), yBoth)

# Compute the best-fit solution
yFit = long_function(x, *poptBoth)
print(poptBoth)

# Plot the results
plt.figure(figsize=(9, 4))

plt.subplot(121)
plt.plot(x, np.real(yNoisy), "k.", label="Noisy y")
plt.plot(x, np.real(y), "r--", label="True y")
plt.plot(x, np.real(yFit), label="Best fit")
plt.ylabel("Real part of y")
plt.xlabel("x")
plt.legend()

plt.subplot(122)
plt.plot(x, np.imag(yNoisy), "k.")
plt.plot(x, np.imag(y), "r--")
plt.plot(x, np.imag(yFit))
plt.ylabel("Imaginary part of y")
plt.xlabel("x")

plt.tight_layout()
plt.show()
结果:


在这个例子中找到的最佳拟合参数是
a=1.14
b=0.375
c=-0.236
,和
d=0.163
,考虑到我在这里插入的噪声的振幅,这些参数与真实参数值非常接近。

做得很好。可悲的是,我只能投一张赞成票来回答这个问题。是的,我同意。连接或
hstack
实部和虚部。@JamesPhillips:我也遇到了类似的拟合复函数的问题。你能解释一下答案中x_real=x[:N//2]和x_imag=x[N//2]的意义吗。非常感谢你!!我认为上面的代码有一个问题,我们计算50%输入x的long_function()表示x_real,50%输入x表示x_imag。这意味着我们的函数在x值的全谱中并没有得到同等的评估,拟合后也不会给出真值。我扩展了我的原始答案。我的例子应该是现成的。