正弦数据用PYTHON拟合正弦曲线

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

# 模拟生成一组实验数据
# x = np.arange(0, 30, 0.2)
# y = -0.5 * np.cos(1.1 * x) + 0.5
# y = -7 * np.cos(1.1 * x) + 0.5
y = [111, 140, 172, 207, 243, 283, 319, 350, 383, 414, 443, 463, 483, 497, 505, 508, 503, 495, 479, 463, 439, 412, 381,
     347, 311, 275, 241, 206, 168, 136, 108, 83, 63, 54, 45, 43, 41, 45, 51, 63, 87, 109, 137, 168, 204, 239, 279, 317,
     348, 382, 412, 439, 463, 479, 496, 505, 508, 505, 495, 483, 463, 441, 414, 383, 350, 314, 278, 245, 209, 175, 140,
     140, 110, 85, 63, 51, 45, 41, 41, 44, 49, 63, 82, 105, 135, 166, 200, 236, 277, 313, 345, 379, 409, 438, 463, 479,
     495, 503, 508, 503, 498, 485, 467, 444, 415, 383, 351, 318, 281, 247, 211, 174, 141, 111, 87, 67, 52, 45, 42, 41,
     45, 50, 62, 79, 104, 131, 163, 199, 233, 273, 310, 345, 377, 407, 435, 460, 479, 494, 503, 508, 505, 499, 486, 467,
     445, 419, 387, 355, 319, 284, 249, 215, 177, 143, 113, 87, 67, 55, 46, 43, 41, 44, 48, 63, 79, 102, 127, 159, 191,
     232, 271, 307, 343, 373, 404, 437, 457, 478, 492, 503, 508, 505, 499, 488, 470, 447, 420, 391, 360, 323, 287, 254,
     215, 182, 147, 116, 92, 70, 55, 46, 43, 42, 43, 49, 60, 76, 99, 127, 159, 191, 227, 268, 303, 339, 371, 401, 431,
     456, 476, 492, 502, 507, 507, 500, 488, 471, 447, 424, 392, 361, 326, 287, 287, 255, 220, 185, 149, 119, 92, 72,
     55, 47, 42, 41, 43, 47, 57, 76, 95, 124, 156, 189, 223, 258, 302, 337, 367, 399, 428, 456, 476, 492, 502, 508, 508,
     501, 489, 471, 451, 425, 396, 364, 328, 294, 259, 223, 188, 151, 119, 95, 72, 57, 46, 43, 44, 43, 47, 57, 73, 95,
     124, 153, 187, 222, 255, 297, 335, 366, 398, 426, 451, 471, 494, 502, 507, 508, 502, 489, 474, 453, 428, 398, 367,
     332, 296, 262, 227, 191, 154, 124, 95, 75, 60, 47, 43, 41, 41, 46, 55, 72, 94, 119, 150, 183, 215, 255, 295, 331,
     361, 396, 424, 447, 471, 489, 500, 508, 508, 502, 492, 475, 454, 430, 401, 369, 335, 299, 265, 228, 191, 157, 126,
     99, 76, 59, 49, 44, 41, 41, 46, 55, 72, 92, 118, 147, 179, 215, 252, 291, 328, 360, 392, 422, 447, 471, 488, 499,
     507, 508, 503, 493, 477, 456, 431, 403]
x = np.arange(0, len(y))
# numpy.random.uniform(low,high,size) 从一个均匀分布[low, high)中随机采样,注意定义域是左闭右开,size输出样本数量,返回ndarray类型
noise = np.random.uniform(0, 0.1, len(x))
# print("nosie:", noise)
# y += noise
# print("Y数值", y)
fig, ax = plt.subplots()  # 创建子图函数,fig代表整个图形,ax代表图形中的坐标轴。通过对ax进行操作,便可在fig中绘制图形
ax.plot(x, y, 'b--', label='org-data')


def target_func(x, a0, a1, a2, a3):
    # 返回一个sin公式 a0振幅,a1周期、频率,圆周运动角速度,a2相位,圆周运动起始位置即时间为0时点所在位置
    return a0 * np.sin(a1 * x + a2) + a3


# 拟合sin曲线
fs = np.fft.fftfreq(len(x), x[1] - x[0])  # 傅里叶变换fft得到一个初值,fftfreq返回傅里叶变换的采样频率,自动生成一个频率范围
Y = abs(np.fft.fft(y))  # fft计算一维傅里叶变换,abs函数主要作用就是计算数字的绝对值
# print("Y: ", Y)
freq = abs(fs[np.argmax(Y[1:]) + 1])  # np.argmax用于返回一个numpy数组中最大值的索引值
# print("frep: ", freq )
a0 = max(y) - min(y)  # max() 方法返回给定参数的最大值,参数可以为序列
print("a0:", a0)
a1 = 2 * np.pi * freq
a2 = 0
a3 = np.mean(y)  # 求均值
p0 = [a0, a1, a2, a3]

para, _ = optimize.curve_fit(target_func, x, y, p0=p0)  # 三角函数拟合 p0参数的初始猜测(长度 N),如果为None,则初始值为1
print("para", para)
y_fit = [target_func(a, *para) for a in x]  # *用于参数前面,表示传入的多个参数将按照元组的形式存储,*args 表示任何多个无名参数,它本质是一个 tuple
print("*para:", *para)
ax.plot(x, y_fit, 'g', label='simu-data')
ax.legend()
plt.show()

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlexFang0904

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值