Matlab R2018b绘制特征值(根轨迹)出现空白图问题咨询
解决Matlab绘制特征值根轨迹空白图的问题
嘿,我帮你找出了代码里导致空白图的几个关键问题,咱们逐个梳理并修正:
1. 最核心的错误:变量计算位置不对
你把A2、A1、A0这三个依赖于U的表达式放在了循环外面,这时候U还没被赋值(循环里的U是循环变量,和外面未定义的U不是一回事),所以这三个变量全是无效值(要么NaN,要么报错),后续算出来的特征值自然没法正常绘制。
2. 绘图时没有保持图窗
每次循环调用plot时,Matlab默认会清空当前图重新画,就算前面计算没问题,最后也只会显示最后一次循环的点,运气不好的话最后一次点异常就直接空白了。
3. 漏掉了一个特征值
你的特征方程是二次的,应该有两个根,但你只算了带加号的那个根,另一个带减号的根完全没处理,这样根轨迹是不完整的。
4. 疑似表达式笔误
看A0里的(Cf*Lf-Cr*Lr^2),对比前面的m*(Cf*Lf-Cr*Lr),这里的Lr^2大概率是笔误,应该是Lr,否则物理模型逻辑不对,这个你得结合自己的实际模型确认下。
5. 未定义物理参数
代码里的m、J、Cf这些物理参数都没赋值,Matlab会把它们当未定义变量,要么直接报错,要么计算结果全是垃圾值。
修正后的完整代码
% 先给物理参数赋值(根据你的实际模型调整数值) m = 1500; % 车辆质量 J = 2000; % 转动惯量 Cf = 30000; % 前侧偏刚度 Cr = 35000; % 后侧偏刚度 Lf = 1.2; % 质心到前轴距离 Lr = 1.5; % 质心到后轴距离 % 初始化图窗:保持绘图、打开网格、添加标签 figure; hold on; grid on; xlabel('实部'); ylabel('虚部'); title('特征值根轨迹随前向速度U的变化'); % 遍历前向速度U计算特征值 for U = 1:80 % 每次循环都重新计算A2/A1/A0,因为它们依赖当前U A2 = m*J; A1 = J*((Cf+Cr)/U) + m*((Cf*Lf^2 + Cr*Lr^2)/U^2); % 修正疑似笔误的A0项(如果确认是笔误的话) A0 = ((Cf+Cr)/U)*((Cf*Lf^2 + Cr*Lr^2)/U) - m*(Cf*Lf - Cr*Lr) - ((Cf*Lf - Cr*Lr)/U^2); % 计算二次方程的两个特征值 lambda1 = (-A1 + sqrt(A1^2 - 4*A0*A2))/(2*A2); lambda2 = (-A1 - sqrt(A1^2 - 4*A0*A2))/(2*A2); % 绘制两个特征值,用不同颜色标记区分 plot(real(lambda1), imag(lambda1), 'bo'); % 蓝色点标记第一个根 plot(real(lambda2), imag(lambda2), 'ro'); % 红色点标记第二个根 end hold off;
小建议
- 如果想让根轨迹更平滑,可以把
U = 1:80改成U = linspace(1,80,100),生成更密集的速度点。 - 因为
U从1开始,避免了除以0的问题,要是后续需要包含低速,记得加判断处理。 - Matlab会自动处理复数的开根号,所以不用担心根号里为负的情况,
real()和imag()能正确提取实部虚部。
内容的提问来源于stack exchange,提问作者mfarrell
相关产品推荐
相关产品推荐

