### 使用 Python 实现基于最小二乘法的三角函数拟合
为了实现基于最小二乘法的三角函数拟合,可以利用 `numpy` 和 `scipy.optimize.curve_fit` 函数完成。以下是详细的说明和示例代码。
#### 数据准备
假设有一组带有噪声的数据点 `(x, y)`,目标是对这些数据进行三角函数拟合。通常情况下,可以选择正弦或余弦作为基础模型,并加入相位偏移、振幅调整等参数以提高灵活性。
#### 数学建模
设待拟合的目标函数形式如下:
\[
f(x; A, B, C) = A \cdot \sin(B \cdot x + C)
\]
其中 \(A\) 是振幅,\(B\) 控制频率,而 \(C\) 表示相位偏移量。
---
#### 示例代码
```python
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 定义三角函数模型
def trig_func(x, A, B, C):
"""
用于拟合的三角函数模型。
参数:
x: 自变量数组
A: 振幅
B: 频率因子
C: 相位偏移
返回值:
计算得到的因变量值
"""
return A * np.sin(B * x + C)
# 生成模拟数据(带噪声)
np.random.seed(42) # 设置随机种子以便结果可重复
x_data = np.linspace(0, 10, 50) # 自变量范围
true_params = [3.0, 1.0, 0.5] # 真实参数 (A=3, B=1, C=0.5)
y_true = trig_func(x_data, *true_params) # 不含噪声的真实数据
noise = np.random.normal(scale=0.5, size=y_true.shape) # 添加高斯白噪声
y_noisy = y_true + noise # 含有噪声的实际观测数据
# 使用curve_fit执行最小二乘拟合
initial_guess = [2.0, 0.8, 0.3] # 初始猜测值
params_optimized, params_covariance = curve_fit(trig_func, x_data, y_noisy, p0=initial_guess)
print(f"优化后的参数: {params_optimized}") # 输出拟合结果
# 绘图展示拟合效果
plt.figure(figsize=(8, 6))
plt.scatter(x_data, y_noisy, label="噪声数据", color="blue") # 噪声数据
plt.plot(x_data, y_true, 'r-', label="真实曲线", linewidth=2) # 真实曲线
plt.plot(x_data, trig_func(x_data, *params_optimized), 'g--', label="拟合曲线", linewidth=2) # 拟合曲线
plt.legend()
plt.title("三角函数拟合演示")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
```
上述代码实现了以下功能:
1. **定义模型**:通过自定义函数 `trig_func` 描述了三角函数的形式[^1]。
2. **生成数据**:创建了一组含有噪声的仿真数据[^2]。
3. **调用 `curve_fit` 进行拟合**:输入初始猜测值并返回最优参数及其协方差矩阵[^3]。
4. **可视化结果**:绘制原始数据、真实曲线以及拟合曲线以验证拟合质量。
---
#### 结果解释
运行以上代码后会显示一张图表,其中包括三个部分:
- 蓝色散点表示实际测量到的含噪数据;
- 红线代表理论上的无误差真值;
- 绿虚线则展示了经过最小二乘法计算得出的最佳逼近曲线。
最终打印出来的 `params_optimized` 即为所求得的最接近真实的参数集合。
---