使用欧拉法绘图时T值显示异常问题求助
MATLAB欧拉法绘图异常问题排查与修复
核心问题定位
你的代码存在两个关键错误,导致T数组仅显示初始值:
迭代循环索引错误
内层欧拉迭代从i=2开始,跳过了i=1的计算,导致T(2)始终为初始0值,后续仅更新T(3)到T(end)。若t数组长度较小,会出现大部分T值未被迭代的情况,绘图自然只显示初始值。数组未每次循环重置
C、T、Gbar、G、N在外部初始化,每次遍历C0_values时仅修改第1个元素,后续元素残留上一次循环的计算值,导致数据混乱。
修复方案
1. 修正循环索引
将内层循环的起始索引改为i=1,确保从初始值开始依次计算所有后续时刻的数值:
for i = 1:length(t)-1
2. 移数组初始化到循环内部
每次处理新的C0时,重新初始化所有数组,避免残留值干扰:
for j = 1:length(C0_values) % 每次循环重新初始化数组 C = zeros(length(t), 1); T = zeros(length(t), 1); Gbar = zeros(length(t), 1); G = zeros(length(t), 1); N = zeros(length(t), 1); C(1) = C0_values(j); T(1) = 0.025 * K; Gbar(1) = 0.1 * T(1); G(1) = K - Gbar(1); N(1) = K - T(1); % 迭代计算 for i = 1:length(t)-1 % Heaviside函数计算 if Gbar(i) + G(i) >= 1 H = 1; else H = 0; end % 欧拉法迭代 C(i+1) = C(i) + dt * ((Pc * C(i) * (T(i) + Gbar(i))) / (gT + (T(i) + Gbar(i))) - (a * C(i) * T(i)) - ((1/tc) * C(i))); T(i+1) = T(i) + dt * (mT * T(i) * (1 - (T(i) / K)) - (wT * (G(i) + Gbar(i)) * T(i)) - (jT * T(i) * C(i))); Gbar(i+1) = Gbar(i) + dt * (mg * Gbar(i) * (1 - (Gbar(i) / Klim)) - (wg * Gbar(i) * T(i)) - (jg * Gbar(i) * C(i))); G(i+1) = G(i) + dt * (mg * G(i) * (1 - (G(i) / (K - Klim))) - (wg * G(i) * T(i))); N(i+1) = N(i) + dt * (w * (G(i+1) + Gbar(i+1)) * H * (-1 * (G(i+1) + Gbar(i+1))) * N(i)); end plot(t, T, 'LineWidth', 0.1, 'DisplayName', sprintf('C0 = %.e', C0_values(j))); hold on; end
3. 可选优化:Heaviside函数简化
可使用MATLAB内置的heaviside函数替代手动判断,简化代码:
H = heaviside(Gbar(i) + G(i) - 1);
验证建议
修复后可通过在迭代循环内添加disp(T(i+1)),实时查看T值的迭代更新情况,确认数值是否符合预期。
内容的提问来源于stack exchange,提问作者reen
相关产品推荐
相关产品推荐

