欢迎访问宙启技术站
智能推送

Python中使用fmin_powell()函数求解非线性最小二乘拟合问题

发布时间:2023-12-26 18:15:33

在Python中,可以使用SciPy库的optimize模块中的fmin_powell()函数来求解非线性最小二乘拟合问题。fmin_powell()函数使用Powell's method来寻找函数的最小值。

下面是一个使用fmin_powell()函数进行非线性最小二乘拟合的例子:

假设我们有一组数据点 (x, y),我们希望找到 的曲线拟合这些数据点。我们可以将曲线定义为一个指数函数:y = a * exp(b * x),其中a和b是拟合参数。

首先,我们需要导入必要的库:

import numpy as np
from scipy.optimize import fmin_powell

然后,我们定义拟合函数和误差函数:

def exponential_func(x, a, b):
    return a * np.exp(b * x)

def error_func(params, x, y):
    a, b = params
    y_pred = exponential_func(x, a, b)
    error = y_pred - y
    return np.sum(error**2)

接下来,我们生成一些随机数据点:

np.random.seed(0)  # 设置随机种子,以确保结果可重现

# 生成 x 值
x = np.linspace(0, 5, 100)

# 生成 y 值,带噪声
a_true = 3.0
b_true = -0.5
y_true = exponential_func(x, a_true, b_true)
y = y_true + np.random.normal(scale=0.1, size=len(x))

现在,我们可以使用fmin_powell()函数寻找 拟合参数:

# 初始参数值
params_init = [1.0, 1.0]

# 调用 fmin_powell() 函数
params_best = fmin_powell(error_func, params_init, args=(x, y))

# 输出      参数值
a_best, b_best = params_best
print("Best fit parameters: a =", a_best, ", b =", b_best)

最终的输出将显示 拟合参数的值。

此外,如果想将拟合曲线绘制出来,可以使用以下代码:

import matplotlib.pyplot as plt

plt.scatter(x, y, label='Data')
plt.plot(x, exponential_func(x, a_best, b_best), color='red', label='Best fit')
plt.plot(x, y_true, color='green', label='True function')
plt.legend()
plt.show()

这将绘制出数据点、 拟合曲线和真实函数的曲线。

总结起来,使用fmin_powell()函数求解非线性最小二乘拟合问题的步骤包括:定义拟合函数和误差函数,准备数据,设置初始参数值,调用fmin_powell()函数获得 拟合参数,并可选择性地绘制拟合曲线。