【Python3】P1888 三角函数

该问题要求输入一组不相等的勾股数a,b,c,然后以分数形式输出其中较小锐角的正弦值,且结果需要进行约分处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷题库 P1888 三角函数

# 三角函数

## 题目描述

输入一组勾股数 $a,b,c(a\neq b\neq c)$,用分数格式输出其较小锐角的正弦值。(要求约分。)

### 使用 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` 即为所求得的最接近真实的参数集合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值