鱼C论坛

 找回密码
 立即注册
查看: 2960|回复: 7

[已解决]Python如何画二阶传感器频率响应特性曲线

[复制链接]
发表于 2023-12-31 18:17:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
公式:
11111.png
需要利用python将二阶传感器频率响应特性曲线绘出如下图:
222222.png

找了下代码找不到只好求助各位坛友了
搜索到的代码如下,但是不知道咋改
import numpy as np
import matplotlib.pyplot as plt
 
# 定义传感器的频率范围和对应的幅值
frequencies = [10, 20, 30] # 频率列表(单位为Hz)
amplitudes = [5, 8, 6]    # 相应的幅值列表
 
# 计算角度范围
angles = []
for freq in frequencies:
    angles += list(np.arange(-90, 91)) * int(freq / 10)
 
# 将角度转换为弧度
radian_angles = np.deg2rad(angles)
 
# 根据传感器模型计算每个角度点上的幅值
response = []
for angle in radian_angles:
    response.append((angle**4 + 7*angle**2 - 1)/(angle**4 + 7*angle**2 + 1))
 
# 绘制频率响应特性曲线
plt.figure()
plt.title("Frequency Response Characteristic")
plt.xlabel('Angle')
plt.ylabel('Amplitude')
plt.grid(True)
plt.plot(angles, response)
plt.show()
最佳答案
2024-1-1 23:49:59
PriceXiao 发表于 2024-01-01 23:49
感谢你的热线回复,这个不对生成不是图片中的曲线,我 ...


非常抱歉给您带来困惑。我刚刚检查了一下代码,发现在计算幅值时有一个错误。在原本的代码中,我们使用了`response.append((angle**4 + 7*angle**2 - 1)/(angle**4 + 7*angle**2 + 1))`计算幅值,但是这个计算公式是不正确的。

为了正确地绘制二阶传感器的频率响应特性曲线,需要根据传感器的特性来计算幅值。由于没有给出传感器的具体特性,我无法提供准确的代码。但我可以给你提供一个通用的示例,仅供参考:
import numpy as np
import matplotlib.pyplot as plt

# 定义传感器的频率范围和对应的幅值
frequencies = np.arange(10, 1001)  # 频率范围是10Hz到1000Hz
amplitudes = []

# 根据传感器模型计算每个频率点上的幅值
for freq in frequencies:
    amplitude = # 根据传感器模型计算幅值
    amplitudes.append(amplitude)

# 绘制频率响应特性曲线
plt.figure()
plt.title("Frequency Response Characteristic")
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.plot(frequencies, amplitudes)
plt.show()

请根据实际情况进行修改,将传感器模型中的计算幅值的代码填充在`amplitude = # 根据传感器模型计算幅值`这一行。只有根据传感器特性来计算幅值,才能得到正确的频率响应特性曲线。

如果您有传感器的具体特性公式或其他相关信息,请提供给我,我将帮助您在代码中进行适当的修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-31 18:17:29 | 显示全部楼层
这个问题的关键是如何定义频率范围和对应的幅值。下面我给出了一个示例代码,其中频率范围为10Hz到1000Hz,对应的幅值为随机生成的一组数据,请根据实际情况进行修改:
import numpy as np
import matplotlib.pyplot as plt

# 定义传感器的频率范围和对应的幅值
frequencies = np.arange(10, 1001)  # 频率范围是10Hz到1000Hz
amplitudes = np.random.random(len(frequencies))  # 相应的幅值为随机生成的一组数据

# 计算角度范围
angles = []
for freq in frequencies:
    angles += list(np.arange(-90, 91)) * int(freq / 10)

# 将角度转换为弧度
radian_angles = np.deg2rad(angles)

# 根据传感器模型计算每个角度点上的幅值
response = []
for angle in radian_angles:
    response.append((angle**4 + 7*angle**2 - 1)/(angle**4 + 7*angle**2 + 1))

# 绘制频率响应特性曲线
plt.figure()
plt.title("Frequency Response Characteristic")
plt.xlabel('Angle')
plt.ylabel('Amplitude')
plt.grid(True)
plt.plot(angles, response)
plt.show()

希望这能解决您的问题,如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-1 23:49:47 | 显示全部楼层
FishC 发表于 2023-12-31 18:17
这个问题的关键是如何定义频率范围和对应的幅值。下面我给出了一个示例代码,其中频率范围为10Hz到1000Hz, ...

感谢你的热线回复,这个不对生成不是图片中的曲线,我百度的代码也是你这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-1 23:49:59 | 显示全部楼层    本楼为最佳答案   
PriceXiao 发表于 2024-01-01 23:49
感谢你的热线回复,这个不对生成不是图片中的曲线,我 ...


非常抱歉给您带来困惑。我刚刚检查了一下代码,发现在计算幅值时有一个错误。在原本的代码中,我们使用了`response.append((angle**4 + 7*angle**2 - 1)/(angle**4 + 7*angle**2 + 1))`计算幅值,但是这个计算公式是不正确的。

为了正确地绘制二阶传感器的频率响应特性曲线,需要根据传感器的特性来计算幅值。由于没有给出传感器的具体特性,我无法提供准确的代码。但我可以给你提供一个通用的示例,仅供参考:
import numpy as np
import matplotlib.pyplot as plt

# 定义传感器的频率范围和对应的幅值
frequencies = np.arange(10, 1001)  # 频率范围是10Hz到1000Hz
amplitudes = []

# 根据传感器模型计算每个频率点上的幅值
for freq in frequencies:
    amplitude = # 根据传感器模型计算幅值
    amplitudes.append(amplitude)

# 绘制频率响应特性曲线
plt.figure()
plt.title("Frequency Response Characteristic")
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.plot(frequencies, amplitudes)
plt.show()

请根据实际情况进行修改,将传感器模型中的计算幅值的代码填充在`amplitude = # 根据传感器模型计算幅值`这一行。只有根据传感器特性来计算幅值,才能得到正确的频率响应特性曲线。

如果您有传感器的具体特性公式或其他相关信息,请提供给我,我将帮助您在代码中进行适当的修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
PriceXiao + 3 + 3 + 2 感谢你的热心回复,公式我图片上放了,系数.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-1 23:55:13 | 显示全部楼层
本帖为密码帖 ,请输入密码 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-1 23:55:38 | 显示全部楼层
PriceXiao 发表于 2024-01-01 23:55
1、我已经通过其他学习视频理解了生成曲线的原理。只 ...


非常抱歉给您带来困惑。您提供的代码中,缺少了一些必要的参数和定义,例如系数T的值、角度degree_values的值等。此外,生成y值列表的循环部分也有一些问题。根据您提供的公式和曲线图,我重新编写了代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
from matplotlib import font_manager

# 指定中文字体的路径
font = 'C:/Windows/Fonts/simsun.ttc'  # 根据实际情况修改字体文件名及路径
prop = font_manager.FontProperties(fname=font)  # 设置默认字体为中文字体
plt.rcParams['font.sans-serif'] = prop.get_name()

# 幅频特性曲线
fig, ax = plt.subplots()

T = [0.1, 0.3, 0.5]  # 系数
x = np.arange(0, 1000) / 100  # w/wn的范围

for t in T:
    y = 1 / np.math.sqrt((1 - x**2)**2 + (2 * t * x)**2)  # 公式
    plt.plot(x, y)

ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(0.5))

plt.xlabel('$\omega / \omega_n$')
plt.ylabel('A($\omega$)')
plt.title("幅频特性曲线")

plt.grid(True)
plt.show()

# 相频特性曲线
fig, ax = plt.subplots()

T = [0.1, 0.3, 0.5]  # 系数
x = np.linspace(0, 10.0, 1000)

for t in T:
    y = -np.arctan((2 * t * x) / (1 - x**2)) * (180 / np.pi)
    y[x > 1] -= 180  # 转换角度为负值
    
    plt.plot(x, y)

ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(30))

plt.xlabel('$\omega / \omega_n$')
plt.ylabel('$\phi (\omega)$')
plt.title("相频特性曲线")

plt.grid(True)
plt.show()
请根据实际情况修改代码中的系数T的值,并在运行代码时确保字体文件路径的正确性。希望这次能够帮助您成功绘制出幅频特性曲线和相频特性曲线。如果还有其他问题,请随时提问。谢谢!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-2 00:10:02 | 显示全部楼层
FishC 发表于 2024-1-1 23:49
非常抱歉给您带来困惑。我刚刚检查了一下代码,发现在计算幅值时有一个错误。在原本的代码中,我们使用 ...

系数是T = [0.1,0.2,0.4,0.6,0.8,1.0] #系数
公式有两个:
val = -np.math.atan(((2 * t * a)) / (1 - a**2))* (180 / np.math.pi)

y.append(1/np.math.sqrt((1 - t**2)**2 + (2 * a * t) ** 2)) #公式

目前图我画出来了下面代码贴了,但是目前我不知道x和y轴 要如何不等比例间距局部拉伸0到2区间的曲线  比如 1 到2  要弄成 比2到3宽达到书中的图片曲线,感觉只能研究多个图片组合成一个的方式,但感觉太复杂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 00:10:12 | 显示全部楼层
PriceXiao 发表于 2024-01-02 00:10
系数是T =  #系数
公式有两个:
val = -np.math.ata ...


理解你的问题了。你可以使用matplotlib中的`ax.set_aspect()`函数来控制轴的纵横比例,以实现不等比例间距的效果。下面是一个示例代码:import numpy as npimport matplotlib.pyplot as plt# 定义传感器的参数a = 0.5T = np.arange(0, 2, 0.01)y = []# 计算每个t对应的值for t in T:    val = -np.math.atan(((2 * t * a)) / (1 - a**2))* (180 / np.math.pi)    y.append(1/np.math.sqrt((1 - t**2)**2 + (2 * a * t) ** 2))# 绘制曲线fig, ax = plt.subplots()ax.plot(T, y)# 设置x轴和y轴的纵横比例ax.set_aspect(1)ax.set_xlim([1, 2])ax.set_ylim([0, max(y)])plt.show()在代码中,我们首先定义了传感器的参数a和T的取值范围。然后根据给定的公式计算出每个T对应的y值。接下来创建一个图形对象和轴对象,绘制曲线并设置x轴和y轴的范围。最后使用`ax.set_aspect(1)`函数将轴的纵横比例设置为1,即实现了不等比例间距的效果。你可以根据需要修改x轴和y轴的范围来控制曲线的显示。希望这个方法能够帮助你实现你想要的效果。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表