Julia求解Lorenz方程遇UndefVarError报错,求解决方案
Lorenz方程求解代码错误排查与修正
核心错误点说明
- 微分方程函数签名错误:DifferentialEquations.jl要求ODE函数的参数顺序为
(du, u, p, t),原代码写为(t,p,u,du),导致变量映射混乱。 - 初始条件变量命名错误:
u[0] = [x₀, 1, 0]是语法错误,正确写法是u0 = [x₀, 1, 0](混淆了数组索引和变量名)。 - 未定义变量滥用:
lorenz_solver中引用了未定义的params,lorenz_plot中直接使用未定义的prob和t,完全没有调用solver生成解。 - 绘图逻辑错误:没有从解对象中提取时间序列
t,也没有正确传递初始条件和ρ参数。
修正后的完整代码
using DifferentialEquations using Plots using LaTeXStrings # 修正微分方程函数签名顺序 function lorenz!(du, u, p, t) x, y, z = u sigma, ρ, beta = p du[1] = sigma * (y - x) du[2] = x * (ρ - z) - y du[3] = x * y - beta * z end # 修正求解器逻辑,移除未定义变量 function lorenz_solver(x₀, ρ) u0 = [x₀, 1.0, 0.0] # 初始条件变量名修正,统一浮点类型 tspan = (0.0, 100.0) p = [10.0, ρ, 8/3] # 参数统一浮点类型 prob = ODEProblem(lorenz!, u0, tspan, p) sol = solve(prob) return sol end # 重写绘图函数,正确调用求解器并提取数据 function lorenz_plot() # ρ=14的两组解 sol1 = lorenz_solver(0.0, 14) sol2 = lorenz_solver(1e-5, 14) t = sol1.t # 从解对象提取时间序列 p1 = plot(t, [sol1[1,:] sol2[1,:]], ylabel=L"x_1, x_2", title="ρ = 14", legend=:right) p2 = plot(t, abs.(sol1[1,:] .- sol2[1,:]), xlabel=L"t", ylabel=L"|x_1 - x_2|") p3 = plot(sol1, vars=(1,2,3), xlabel=L"x", ylabel=L"y", zlabel=L"z", title="相空间(ρ=14)") # ρ=28的两组解 sol3 = lorenz_solver(0.0, 28) sol4 = lorenz_solver(1e-5, 28) p4 = plot(t, [sol3[1,:] sol4[1,:]], title="ρ = 28", legend=:right) p5 = plot(t, abs.(sol3[1,:] .- sol4[1,:]), xlabel=L"t", ylabel=L"|x_1 - x_2|") p6 = plot(sol3, vars=(1,2,3), xlabel=L"x", ylabel=L"y", zlabel=L"z", title="相空间(ρ=28)") # 排版绘图 plot(p1, p2, p3, p4, p5, p6, layout=(3,2), link=:all, size=(1000, 800)) end # 导出函数 export lorenz_solver, lorenz_plot
额外说明
- 统一使用浮点类型避免类型不稳定问题;
- 绘图时明确提取解的第一个分量(x变量)进行对比;
- 相空间图补充了坐标轴标签,增强可读性;
- 修正后的代码可直接在Julia环境或Jupyter Notebook中运行,不会出现未定义变量错误。
内容的提问来源于stack exchange,提问作者Hana Bachi
相关产品推荐
相关产品推荐

