如何将Symbolics.jl中的符号方程转换为变量以求解ODE问题?
问题描述
已通过Symbolics.jl的纯符号方式构建了如下微分方程组:
using Symbolics @syms α ρ[1:2, 1:2] dαdt dρdt[1:2, 1:2] eqs = [] push!(eqs, dαdt == α*(ρ[1,1] +ρ[1,2] + ρ[2,1] + ρ[2,2])) for i in 1:2, j in 1:2 push!(eqs, dρdt[i,j] == α*ρ[j,i]) end
现在需要将这个已定义的符号方程组转换为适配ModelingToolkit.jl中带时间变量(αvar(t)、ρvar(t))的形式,用于构建ODEProblem求解**(不允许从头用目标变量重新定义方程组)**。
解决方案
你可以通过符号替换的方式将原有方程组映射到带时间的变量及其导数上,具体步骤如下:
1. 定义替换映射
首先创建一个字典,把原符号变量和对应的ModelingToolkit变量/导数一一对应:
using ModelingToolkit @variables t::Real, αvar(t)::Complex{Real}, ρvar(t)[1:2, 1:2]::Complex{Real} # 构建替换规则:原变量 → 目标变量/导数 subs_map = Dict( α => αvar(t), [ρ[i,j] => ρvar(t)[i,j] for i in 1:2, j in 1:2]..., dαdt => Differential(t)(αvar(t)), [dρdt[i,j] => Differential(t)(ρvar(t)[i,j]) for i in 1:2, j in 1:2]... )
2. 批量替换方程组中的变量
用Symbolics的substitute函数对原有方程组做全局替换:
# 替换所有方程中的符号 mtk_eqs = substitute.(eqs, (subs_map,))
3. 构建ODEProblem并求解
现在mtk_eqs就是适配ModelingToolkit的方程组,可以直接用来构建问题:
# 定义初始条件和参数(示例值) u0 = [ αvar => 0.1 + 0.0im, [ρvar[i,j] => (i == j ? 0.5 : 0.0) + 0.0im for i in 1:2, j in 1:2]... ] tspan = (0.0, 10.0) # 构建ODE问题 @named sys = ODESystem(mtk_eqs) prob = ODEProblem(sys, u0, tspan) # 求解(需要用到DifferentialEquations.jl) using DifferentialEquations sol = solve(prob, Tsit5())
内容的提问来源于stack exchange,提问作者David Schlegel
相关产品推荐
相关产品推荐

