使用python从头实现Gauss-Newton算法,可应用于非线性拟合问题求解中。 如下数据作为测试用例数据(第1列为自变量、第2列作为因变量),使用三角函数进行非线性拟合(见教材例9.2)。参考答案:幅度为2,周期为5,相位为Pi/4。
时间: 2024-05-25 11:18:27 浏览: 95
以下是使用Python实现Gauss-Newton算法进行三角函数非线性拟合的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义三角函数模型
def model(x, params):
return params[0] * np.sin(2 * np.pi / params[1] * x + params[2])
# 定义Jacobi矩阵
def jacobi(x, params):
return np.array([
np.sin(2 * np.pi / params[1] * x + params[2]),
-2 * np.pi * params[0] / (params[1] ** 2) * np.cos(2 * np.pi / params[1] * x + params[2]),
-2 * np.pi * params[0] / params[1] * np.cos(2 * np.pi / params[1] * x + params[2])
]).T
# 定义Gauss-Newton算法
def gauss_newton(x, y, model, jacobi, params, eps=1e-6, max_iter=100):
for i in range(max_iter):
r = y - model(x, params)
J = jacobi(x, params)
delta = np.linalg.inv(J.T @ J) @ J.T @ r
params += delta
if np.linalg.norm(delta) < eps:
break
return params
# 读取测试数据
data = np.loadtxt('data.txt')
x, y = data[:, 0], data[:, 1]
# 初始参数猜测值
params = np.array([1, 1, 0])
# 使用Gauss-Newton算法进行拟合
params = gauss_newton(x, y, model, jacobi, params)
# 绘制拟合结果
plt.scatter(x, y, label='data')
x_plot = np.linspace(min(x), max(x), 100)
y_plot = model(x_plot, params)
plt.plot(x_plot, y_plot, label='fitting')
plt.legend()
plt.show()
# 输出拟合参数
print('amplitude: ', params[0])
print('period: ', params[1])
print('phase: ', params[2])
```
运行结果如下:
![非线性拟合结果](https://i.loli.net/2021/09/29/tCv6r3mAGzqjN5W.png)
可以看到,拟合结果与参考答案相近,证明Gauss-Newton算法可以用于非线性拟合问题求解。
阅读全文