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

您所在的位置:网站首页 用python画心形 正弦数据用PYTHON拟合正弦曲线

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

2023-03-27 06:16| 来源: 网络整理| 查看: 265

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

wx63b7e0251fc35 2023-03-25 07:51:23 ©著作权

文章标签 python numpy 机器学习 傅里叶变换 拟合 文章分类 Python 后端开发

©著作权归作者所有:来自51CTO博客作者wx63b7e0251fc35的原创作品,请联系作者获取转载授权,否则将追究法律责任

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()

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

 

收藏 评论 分享 举报

上一篇:Ubuntu启动死机解决方案(测试有效)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3