拦尼斯特 2024-04-18 13:06 采纳率: 0%
浏览 8

利用MATLAB求传递函数伯德图,脚本计算结果与线性化工具箱绘图结果不一致,如何解决?

利用MATLAB求传递函数伯德图,脚本计算结果与线性化工具箱绘图结果不一致

教材原题及计算过程

img

img

img

脚本计算

img

img

img

Simulink

img

img


可以看出Simulink画出的伯德图与理论计算结果有出入

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 13:06
    关注

    引自免费微信小程序:皆我百晓生

    在分析您提供的信息后,我们可以看到您的MATLAB脚本与线性化工具箱绘制的伯德图存在一些差异。首先,让我们回顾一下您提供的MATLAB脚本:

    % MATLAB程序7.12
    nump = [1];
    denp = [0.5 1.5 1 0];
    sysp = tf(nump, denp);
    sys = feedback(sysp, 1);
    w = logspace(-1, 1);
    bode(sys, w)
    [mag, phase, w] = bode(sys, w);
    [Mp, k] = max(mag);
    resonant_peak = 20 * log10(Mp);
    resonant_frequency = w(k);
    n = 1;
    while 20*log10(mag(n)) >= -3;
        n = n + 1;
    end
    bandwidth = w(n);
    

    根据您提供的数据,系统传递函数是 G(s) = 1 / (0.5s^3 + 1.5s^2 + s + 1)

    看起来,您已经正确地创建了传递函数并进行了反馈。但是,可能的问题在于确定谐振频率和带宽的方法。在MATLAB中,bode 函数返回的频率向量 w 是对数间隔的,这意味着直接找到最大幅度对应的频率可能会有些偏差,因为最大幅度可能在两个频率点之间。

    为了更准确地确定谐振频率和带宽,我们可以通过搜索在某个范围内最接近最大幅度附近的最小幅度变化来改进方法。下面是一个更新的版本,用于更精确地确定谐振频率和带宽:

    % ... (前面的代码保持不变)
    
    % 精确查找谐振频率和带宽
    mag_max_index = find(mag == Mp, 1);
    delta_mag_threshold = 0.1; % 根据实际需求调整这个阈值
    left_index = mag_max_index - 1;
    right_index = mag_max_index + 1;
    
    while abs(mag(left_index) - mag_max) > delta_mag_threshold && left_index >= 1
        left_index = left_index - 1;
    end
    
    while abs(mag(right_index) - mag_max) > delta_mag_threshold && right_index <= length(mag)
        right_index = right_index + 1;
    end
    
    resonant_frequency = mean(w(left_index:right_index));
    
    % 带宽计算
    bandwidth_index_left = left_index;
    bandwidth_index_right = right_index;
    
    while 20*log10(mag(bandwidth_index_left)) >= -3;
        bandwidth_index_left = bandwidth_index_left - 1;
    end
    
    while 20*log10(mag(bandwidth_index_right)) >= -3;
        bandwidth_index_right = bandwidth_index_right + 1;
    end
    
    bandwidth = w(bandwidth_index_right) - w(bandwidth_index_left);
    
    % 输出结果
    fprintf('Resonant Peak: %.2f dB\n', resonant_peak);
    fprintf('Resonant Frequency: %.4f rad/s\n', resonant_frequency);
    fprintf('Bandwidth: %.4f rad/s\n', bandwidth);
    

    这段代码首先找到最大幅度的索引,然后在这个索引附近寻找幅度下降到一定程度的频率点。这种方法能更准确地估计谐振频率。对于带宽,它找出低于某个幅度的两个频率点,并计算它们之间的差值作为带宽。

    尝试运行这个修改后的脚本,看看是否能获得与线性化工具箱更一致的结果。如果还有问题,可能是由于Simulink中的设置不同,比如采样率或其他参数的影响。在这种情况下,确保在Simulink中使用的仿真参数与MATLAB脚本中的一致。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 4月18日
  • 创建了问题 4月18日

悬赏问题

  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败