如何使用速率常数和通量评估一阶和二阶反应?

计算科学 模拟
2021-12-01 06:35:15

我想从 Open Cell cellml 文件中用 C# 实现微分方程。本文描述了数学模型我已经解析了 xml,并计算了运算,但无法正确实现方程式。我不明白如何评估微分方程。运算的格式是内容mathml。这是片段:

 <apply>
    <eq/>
    <apply>
       <diff/>
       <bvar>
          <ci>time</ci>
       </bvar>
       <ci>Casp8</ci>
    </apply>
    <apply>
       <plus/>
       <apply>
          <minus/>
          <ci>J_0</ci>
       </apply>
       <ci>J_f0</ci>
       <ci>J_Casp8</ci>
    </apply>
 </apply>
1个回答

好的,这是以一种很难处理的方式指定方程。看起来它被设计为由能够进行符号计算的程序读取,实现起来很痛苦。它以易于转换为符号方程的函数形式指定。要从头开始解释它,您需要:

  • 创建变量的表示
  • 创建 + - * / ^ 等的表示
  • 创建微分算子的表示
  • 实施替代/评估
  • 决定如何将微分方程转换为机器可积形式

像这样的类(或函数)结构非常标准:

+ Expression
   + Variable(String name)
   + Operation(Expression ex1, Expression ex2 ...)
   + Differentiate(Expression ex, Variable v)

基本上,你不想这样做,除非你有很多时间。相信我,我自己做过,很痛苦。最好找一个符号代数包。请参阅此 SE 问题


完成此操作后,您可以轻松编写一个迭代微分方程的函数。在 sudo 代码中,

# For an equation of the form d/dt X = Y(x,t)

function step(equation, x, t, dt)
    lhs = equation[0]
    rhs = equation[1]

    return x + dt * rhs.evaluate(x,t)

function euler_integrate(equation, x0, t0, dt,iters)
    output = empty_list

    x = x0
    t = t0

    for i in 1...iters
    do
        x = step(equation, x, t, dt)
        t = t + dt

        output.append(x)
    done

    return output

这很容易概括。


至于方程式,我理解它说:

[Casp8]=[f0]Ĵ+[Casp8]Ĵ-[某种形式的泄漏]Ĵ

在哪里[X]是和的浓度[X]Ĵ是一个通量(因此,它本身就是一个时间导数)。

使用质量作用动力学或 Gillespie 算法或其他任何方法解决您喜欢的方程。