Python如何画二阶传感器频率响应特性曲线
公式:需要利用python将二阶传感器频率响应特性曲线绘出如下图:
找了下代码找不到只好求助各位坛友了
搜索到的代码如下,但是不知道咋改
import numpy as np
import matplotlib.pyplot as plt
# 定义传感器的频率范围和对应的幅值
frequencies = # 频率列表(单位为Hz)
amplitudes = # 相应的幅值列表
# 计算角度范围
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() 这个问题的关键是如何定义频率范围和对应的幅值。下面我给出了一个示例代码,其中频率范围为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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2023-12-31 18:17
这个问题的关键是如何定义频率范围和对应的幅值。下面我给出了一个示例代码,其中频率范围为10Hz到1000Hz, ...
感谢你的热线回复,这个不对生成不是图片中的曲线,我百度的代码也是你这个 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 小助理,如未能正确解答您的问题,请继续追问。 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 = # 系数
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 = # 系数
x = np.linspace(0, 10.0, 1000)
for t in T:
y = -np.arctan((2 * t * x) / (1 - x**2)) * (180 / np.pi)
y -= 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-1-1 23:49
非常抱歉给您带来困惑。我刚刚检查了一下代码,发现在计算幅值时有一个错误。在原本的代码中,我们使用 ...
系数是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)) #公式
目前图我画出来了下面代码贴了,但是目前我不知道x和y轴 要如何不等比例间距局部拉伸0到2区间的曲线比如 1 到2要弄成 比2到3宽达到书中的图片曲线,感觉只能研究多个图片组合成一个的方式,但感觉太复杂。 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()ax.set_ylim()plt.show()在代码中,我们首先定义了传感器的参数a和T的取值范围。然后根据给定的公式计算出每个T对应的y值。接下来创建一个图形对象和轴对象,绘制曲线并设置x轴和y轴的范围。最后使用`ax.set_aspect(1)`函数将轴的纵横比例设置为1,即实现了不等比例间距的效果。你可以根据需要修改x轴和y轴的范围来控制曲线的显示。希望这个方法能够帮助你实现你想要的效果。如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]