用python做傅里叶变换和系统辨识

news2024/9/24 21:21:01

一、原始信号

1、理想数据

(1)系统参数

参数类型数值
J0.5 k g ∗ m 2 kg*m^2 kgm2
K0.2
b5

(2)激励曲线

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(0, 10, 1000)  # 生成0到10之间的100个数据点
y = 20*np.sin(x)+15*np.sin(2*x)+10*np.cos(x)  # 计算正弦函数值

# 画曲线图
plt.figure()
plt.plot(x, y, label='20sin(x)+15sin(2x)+10cos(x)', color='blue', linestyle='-', linewidth=2)  # 绘制曲线
plt.xlabel('x')  # x轴标签
plt.ylabel('pos')  # y轴标签
plt.title('Excitation Curve')  # 图标题
plt.legend()  # 显示图例
plt.grid(True)  # 显示网格
plt.show()

(3)其他曲线

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

J = 0.5
K = 0.2
b = 51010

# 生成数据
x = np.linspace(0, 10, 1000)  # 生成0到10之间的1000个数据点
pos = 20*np.sin(x) + 15*np.sin(2*x) + 10*np.cos(x)  # 第一条曲线数据
spd = 20*np.cos(x) + 30*np.cos(2*x) - 10*np.sin(x)  # 第二条曲线数据
acc = -20*np.sin(x) - 60*np.sin(2*x) - 10*np.cos(x)  # 第三条曲线数据
tor = J*acc + K*spd + np.sign(spd)*b
# 画曲线图
plt.figure()

# 创建第一个子图

plt.subplot(411)
plt.plot(x, pos, label='pos', color='blue', linestyle='-', linewidth=2)  # 绘制第一条曲线
plt.xlabel('x')
plt.ylabel('pos')
plt.legend()
plt.grid(True)

# 创建第二个子图
plt.subplot(412)
plt.plot(x, spd, label='spd', color='red', linestyle='-', linewidth=2)  # 绘制第二条曲线
plt.xlabel('x')
plt.ylabel('spd')
plt.legend()
plt.grid(True)

# 创建第三个子图
plt.subplot(413)
plt.plot(x, acc, label='acc', color='green', linestyle='-', linewidth=2)  # 绘制第三条曲线
plt.xlabel('x')
plt.ylabel('acc')
# plt.title('Excitation Curve 3')
plt.legend()
plt.grid(True)

plt.subplot(414)
plt.plot(x, tor, label='tor', color='black', linestyle='-', linewidth=2)  # 绘制第三条曲线
plt.xlabel('x')
plt.ylabel('tor')
# plt.title('Excitation Curve 3')
plt.legend()
plt.grid(True)

plt.tight_layout()  # 调整子图布局
plt.show()

2、增加噪声

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

J = 0.5
K = 0.2
b = 5

# 生成数据
x = np.linspace(0, 10, 1000)  # 生成0到10之间的1000个数据点
pos = 20*np.sin(x) + 15*np.sin(2*x) + 10*np.cos(x) + np.random.normal(0, 5, 1000) # 第一条曲线数据
spd = 20*np.cos(x) + 30*np.cos(2*x) - 10*np.sin(x) + np.random.normal(0, 5, 1000) # 第二条曲线数据
acc = -20*np.sin(x) - 60*np.sin(2*x) - 10*np.cos(x) + np.random.normal(0, 5, 1000) # 第三条曲线数据
tor = J*acc + K*spd + np.sign(spd)*b + np.random.normal(0, 5, 1000)
# 画曲线图
plt.figure()

# 创建第一个子图

plt.subplot(411)
plt.plot(x, pos, label='pos', color='blue', linestyle='-', linewidth=2)  # 绘制第一条曲线
plt.xlabel('x')
plt.ylabel('pos')
plt.legend()
plt.grid(True)

# 创建第二个子图
plt.subplot(412)
plt.plot(x, spd, label='spd', color='red', linestyle='-', linewidth=2)  # 绘制第二条曲线
plt.xlabel('x')
plt.ylabel('spd')
plt.legend()
plt.grid(True)

# 创建第三个子图
plt.subplot(413)
plt.plot(x, acc, label='acc', color='green', linestyle='-', linewidth=2)  # 绘制第三条曲线
plt.xlabel('x')
plt.ylabel('acc')
# plt.title('Excitation Curve 3')
plt.legend()
plt.grid(True)

plt.subplot(414)
plt.plot(x, tor, label='tor', color='black', linestyle='-', linewidth=2)  # 绘制第三条曲线
plt.xlabel('x')
plt.ylabel('tor')
# plt.title('Excitation Curve 3')
plt.legend()
plt.grid(True)

plt.tight_layout()  # 调整子图布局
plt.show()

# 创建DataFrame
data = {'x': x, 'pos': pos, 'spd': spd, 'acc': acc, 'tor': tor}
df = pd.DataFrame(data)

# 保存数据到CSV文件
df.to_csv('data_with_noise.csv', index=False)

二、数据预处理

1、傅里叶变换画出频谱图在这里插入图片描述

# 从CSV文件中读取数据
df = pd.read_csv('data_with_noise.csv')
column_name = 'pos'  # 选择要进行傅里叶变换的列名
data = df[column_name].values

# 进行傅里叶变换
fs = 100  # 假设数据是均匀采样的
fft_data = np.fft.fft(data)
freqs = np.fft.fftfreq(len(fft_data), 1/fs)
freqs = freqs[:len(freqs)//2]  # 取一半频谱(对称性)

# 绘制频谱图
plt.figure()
plt.plot(freqs, np.abs(fft_data[:len(fft_data)//2]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.title('Spectrum of the data column')
plt.grid()
plt.show()

2、去除高频噪声并逆傅里叶变换

在这里插入图片描述

# import numpy as np
# import pandas as pd
# import matplotlib.pyplot as plt

# # 从CSV文件中读取数据
# df = pd.read_csv('data_with_noise.csv')
# column_name = 'pos'  # 选择要进行傅里叶变换的列名
# data = df[column_name].values

# # 进行傅里叶变换
# fs = 100  # 采样频率为100 Hz
# fft_data = np.fft.fft(data)
# freqs = np.fft.fftfreq(len(fft_data), 1/fs)

# # 去除大于10Hz的频率成分
# fft_data_filtered = np.copy(fft_data)
# fft_data_filtered[np.where(np.abs(freqs) > 0.5)] = 0

# # 进行逆傅里叶变换
# filtered_data = np.fft.ifft(fft_data_filtered)

# # # 创建新的DataFrame保存原始数据和滤波后的数据
# # new_df = pd.DataFrame({'Original Data': data, 'Filtered Data': np.real(filtered_data)})

# # # 将数据保存到新的CSV文件中
# # new_df.to_csv('filtered_yaw_data.csv', index=False)

# # 绘制时域对比图
# plt.figure()
# plt.plot(data, label='Original Data')
# plt.plot(np.real(filtered_data), label='Filtered Data (freq < 10Hz)')
# plt.xlabel('Time')
# plt.ylabel('Amplitude')
# plt.title('Original Data vs Filtered Data')
# plt.legend()
# plt.grid()
# plt.show()


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 从CSV文件中读取数据
df = pd.read_csv('data_with_noise.csv')
column_name = 'pos'  # 选择要进行傅里叶变换的列名
data = df[column_name].values

# 进行傅里叶变换
fs = 100  # 采样频率为100 Hz
fft_data = np.fft.fft(data)       #离散快速傅里叶变换
freqs = np.fft.fftfreq(len(fft_data), 1/fs)

freqs = freqs[:len(freqs)]  # 取一半频谱(对称性)正
print(freqs)
# 去除大于10Hz的频率成分
fft_data_filtered = np.copy(fft_data)
fft_data_filtered[np.where(np.abs(freqs) > 0.5)] = 0
print(fft_data_filtered)
# 进行逆傅里叶变换
filtered_data = np.fft.ifft(fft_data_filtered)

# 创建新的DataFrame保存原始数据和滤波后的数据
new_df = pd.DataFrame({'Original Data': data, 'Filtered Data': np.real(filtered_data)})
# 将数据保存到新的CSV文件中
new_df.to_csv('filtered_yaw_data.csv', index=False)

# 绘制时域对比图
plt.figure()
plt.plot(data, label='Original Data')
plt.plot(np.real(filtered_data), label='Filtered Data (freq < 10Hz)')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Original Data vs Filtered Data')
plt.legend()
plt.grid()
plt.show()

三、动力学辨识

1、动力学模型

t o r = J ∗ α + K ∗ s p d + s i g n ( s p d ) ∗ b tor = J*\alpha + K*spd+sign(spd)*b tor=Jα+Kspd+sign(spd)b

  • 摩擦力使用粘滞-库伦模型
  • 单自由度的关节模型

2、最小二乘法

在这里插入图片描述

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 从CSV文件中读取数据
df = pd.read_csv('data_with_noise.csv')
column_name_acc = 'Filtered_acc'  # 第一列数据的列名
column_name_v = 'Filtered_spd'  # 第二列数据的列名
column_name_tor = 'Filtered_tor'  # 第三列数据的列名

data_acc = df[column_name_acc].values
data_v = df[column_name_v].values
data_tor = df[column_name_tor].values

# 定义拟合函数
def model_func(inputs, a, b, c):
    acc, v = inputs
    return a * acc + b * v + np.sign(v) * np.abs(c)

# 初始参数猜测值
initial_guess = [1, 1, 1]

# 使用最小二乘法拟合模型
params, covariance = curve_fit(model_func, (data_acc, data_v), data_tor, initial_guess)

# 提取拟合参数
a_fit, b_fit, c_fit = params

# 打印拟合参数
print("拟合参数:")
print("a =", a_fit)
print("b =", b_fit)
print("c =", c_fit)

# 绘制三维效果图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data_acc, data_v, data_tor, color='b', label='Fitted Data')
ax.scatter(data_acc, data_v, model_func((data_acc, data_v), a_fit, b_fit, c_fit), color='r', label='Model Data')
ax.set_xlabel('Filtered Acceleration')
ax.set_ylabel('Filtered Speed')
ax.set_zlabel('Filtered Torque')
ax.set_title('Fitted vs. Actual Data')
plt.legend()
plt.show()

3、结果分析

参数类型数值
J0.50.47
K0.20.275
b5-0.676
  • 转动惯量的部分还是可以的,摩擦力的两个参数就有点离谱了,速度越大摩擦力还小了。这是我觉得辨识方法最尴尬的地方,结果是拟合了,参数没拟合。这还是单自由度的情况下,如果是多自由度的整体辨识,大量参数耦合在一起,就更难说清到底是哪些参数起到了什么样的作用了,这也没比基于神经网络的纯黑盒强多少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下列程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),该函数的功能是:使数组右上半三角元素中的值乘以m。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 下列…

从0到1:社区论坛小程序开发笔记

背景 论坛小程序&#xff1a;为用户提供了一个社交互动的平台&#xff0c;使用户可以分享经验、交流观点、解决问题&#xff0c;促进社区成员之间的互动和交流。 用户可以在论坛小程序上发布有关各种话题的帖子&#xff0c;分享自己的知识、经验和见解&#xff0c;帮助其他用户…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表&#xff0c;对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

【MySQL 数据宝典】【内存结构】- 003 Change Buffer 详解

一、 Change Buffer基本概念 Change Buffer&#xff1a;写缓冲区,是针对二级索引(辅助索引) 页的更新优化措施。 作用: 在进行DML操作时&#xff0c;如果请求的是 辅助索引&#xff08;非唯一键索引&#xff09;没有在缓冲池 中时&#xff0c;并不会立刻将磁盘页加载到缓冲池…

游戏AI智能体模仿学习技术方案揭秘(二)(附方案详情),沉浸式玩家体验秘诀,看《梦三国2》游戏AI智能体!

接上篇内容&#xff0c;小智发现内容非常受游戏开发者们的欢迎&#xff0c;今天给大家带来方案(二&#xff09;内容&#xff0c;没看过第一篇的伙伴可以戳以下链接查看~~码住&#xff01; 游戏AI智能体模仿学习技术方案&#xff08;附方案详情&#xff09;&#xff0c;沉浸式玩…

AQS(AbstractQueuedSynchronizer)队列同步器源码解读

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. AOS、AQS、AQLS的区别 3. AQS的底层原理 3.1. 核心思想 3.2. 数…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation&#xff0c;它是一个抽象类&#xff0c;不能直接使用&#xff0c;需要使用它的子类。它的类结构如下&#xff1a; QAbstractAnimation&#xff1a;抽象动画&#xff0c;是所有动画的基类&#xff0c;不能直接使用。 QVariant…

基于postCSS手写postcss-px-to-vewiport插件实现移动端适配

&#x1f31f;前言 目前前端实现移动端适配方案千千万&#xff0c;眼花缭乱各有有缺&#xff0c;但目前来说postcss-px-to-vewiport是一种非常合适的实现方案&#xff0c;postcss-px-to-vewiport是一个基于postCss开发的插件&#xff0c;其原理就是将项目中的px单位转换为vw(视…

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1&#xff1a;不是所有的token都是必须的 论文地址&#xff1a;https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等&#xff1a;token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B&#xff0c;每1B token保存一个che…

配置nodejs的俩小脚本

介绍&#xff1a;共两个脚本。 脚本1&#xff0c;用来配置环境变量&#xff0c;生成环境变量所需的配置信息&#xff0c;然后自己添加到系统环境变量里去 特别注意&#xff1a;该脚本需要放到nodejs目录下面&#xff0c;如果不是&#xff0c;则无法生成环境变量配置文本内容 另…

【STL概念】

STL STL&#xff08;Standard Template Library),即标准模板库从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件&#xff0…

找不到msvcp140dll,无法继续执行代码的详细解决方法

在我们日常使用计算机进行各类工作任务的过程中&#xff0c;时常会遭遇一些突发的技术问题。比如&#xff0c;有时在运行某个重要程序或应用软件时&#xff0c;系统会突然弹出一个令人困扰的错误提示&#xff1a;“电脑提示找不到msvcp140.dll文件&#xff0c;因此无法继续执行…

Linux CPU 占用率 100% 排查

其他层面要考虑到的地方 mysql&#xff0c;有执行时间特别长的sql、死锁redis雪崩等相关问题并发导出数据量大Java定时器服务业务复杂&#xff0c;比如像每天要更新电商的统计表&#xff0c;每天发送优惠券等业务需要提前计算才能保证业务使用时的流畅性&#xff0c;我这个原因…

【快速上手ESP32(基于ESP-IDFVSCode)】09-Flash存储

ESP32中的Flash 关于ESP32中的Flash&#xff0c;我们需要再回顾一下命名规则。 我用的是立创开发板设计的板子&#xff0c;芯片型号是ESP32S3R8N8&#xff0c;因此可以知道我这块板子有8MB的Flash&#xff0c;大家可以参照着命名规则看看自己有多大的Flash容量。 操作Flash …

学习STM32第十七天

备份域详解 一、简介 在参考手册的电源控制章节&#xff0c;提到了备份域&#xff0c;BKPR是在RTC外设中用到&#xff0c;包含20个备份数据寄存器&#xff08;80字节&#xff09;&#xff0c;备份域包括4KB的备份SRAM&#xff0c;以32位、16位或8位模式寻址&#xff0c;在VBAT…

0.什么是C++(专栏前言)

目录 1.什么是C 2.C的发展史 3.C的重要性 应用&#xff1a; 4.如何学习C 5.关于本专栏 1.什么是C 20世纪80年代&#xff0c;计算机界提出oop(object oriented programming:面向对象&#xff09;思想&#xff0c;支持面向对象的程序设计应运而生。 1982年&#xff0c;本…

去雾笔记-知识蒸馏

知识蒸馏&#xff08;Knowledge distillation&#xff09;是一种模型压缩技术&#xff0c;旨在将一个复杂的模型&#xff08;通常称为“教师模型”&#xff09;的知识转移给一个较简单的模型&#xff08;通常称为“学生模型”&#xff09;&#xff0c;以降低模型的计算复杂度和…

针对窗口数量多导致窗口大小显示受限制的问题,使用滚动条控制窗口

建议&#xff1a;首先观察结果展示&#xff0c;判断是否可以满足你的需求。 目录 1. 问题分析 2. 解决方案 2.1 界面设计 2.2 生成代码 2.3 源码实现 3. 结果展示 1. 问题分析 项目需要显示的窗口数量颇多&#xff0c;主界面中&#xff0c;如果一次性显示全部窗口&#x…

财务管理困扰外贸公司?软件解决方案大揭秘!

本文将探讨外贸公司在财务管理中遇到的难题&#xff0c;提出可能性的解决方案&#xff0c;并概述理想的外贸财务管理软件应具备哪些必备功能。 一、外贸公司财务管理难题 1、交易币种多样化 如何准确记录不同货币的财务活动&#xff0c;是外贸公司必须面对的问题。外贸公司的…

密钥密码学(一)

原文&#xff1a;annas-archive.org/md5/b5abcf9a07e32fc6f42b907f001224a1 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 从秘密解码环到政府政策声明&#xff0c;隐藏和发现信息的挑战长期以来一直吸引着智慧。密码学是一个引人入胜的主题&#xff0c;…