布洛赫方程:添加渐变

信息处理 核磁共振
2022-02-18 05:59:09

我有一个用 Python 实现的 bloch 模拟。实现非常简单,如下:

import numpy as np

GYRO = 267538030.3797  # in radians / s / T
T1 = 0.3
inv_T1 = 1.0/0.3
T2 = 0.05
inv_T2 = 1.0/0.05
M0 = 1.0 

# This function is called at various time steps
def bloch(self, M, B):
    # Solve bloch equation in rotating frame.
    # M: Magnetization vector
    # B: Effective magnetic field
    return GYRO * np.cross(M, B) - [M[0] * inv_T2,
                                    M[1] * inv_T2,
                                    inv_T1 * (M[2] - M0)]

现在,在激励期间,有效场由下式给出: 所以,伪代码为:

B[0]=rf(t)cos(2πωeff t)B[1]=rf(t)sin(2πωeff t)B[2]=0

假设 RF 激发是共振的,即,我跟踪自旋磁化强度随时间的演变,它起作用了,在放松几秒钟后,我们得到了这条曲线:ωeff=0T1

在此处输入图像描述

因此,横向磁化开始消失,纵向磁化恢复。

现在,我想模拟在 RF 脉冲之后应用的读出梯度。现在,当射频脉冲关闭时,有效磁化强度的值为 0。每个时间步长有效场的分量由梯度幅度和位置的乘积给出。所以,XYZ

B[0]=B[1]=0B[2]=gp

现在,当我使用相同的方程来解决这个问题时,我得到了无意义的结果,如下图所示:

在此处输入图像描述

正如你所看到的,这些数字不在图表之列,我期待着最后的回声。渐变是一个简单的梯形渐变,我检查了单位,这一切都说得通。我想知道我在存在梯度的情况下对有效场的表达是否正确?我也看到这些被表示为旋转矩阵,我想知道是否有类似的东西我可能错过了。

更新

根据 M529 的建议,我做了以下实验:

# Change the method to ignore relaxation effects
import numpy as np

GYRO = 267538030.3797  # in radians / s / T

# This function is called at various time steps
def bloch(self, M, B):
    # Solve bloch equation in rotating frame.
    # M: Magnetization vector
    # B: Effective magnetic field
    return GYRO * np.cross(M, B) 

现在我用不同的翻转角度(从 0 到 1200)调用该方法,并注意矢量长度,它不会保持较大翻转角度的长度。所以,也许有一个数字问题。出于计算原因,我增加了射频带宽。这是不同翻转时的磁化图。这是一种奇怪的非线性效应。它首先下降,然后不受控制地爬回。

在此处输入图像描述

1个回答

我不确定这是否相关,但这个叉积是微分方程的一部分,例如 .. . 对于一个真正的无穷小,这是有道理的。出于数字考虑,这不一定是真的。想一想:dMdt=γM×Bdt

  • 暂时忽略放松
  • M0有一定的量级(即长度)
  • 当您应用 rf 脉冲时,您期望的旋转,并且向量的长度在旋转下被保留M0
  • 当你从叉积计算旋转时,有几个时间步长,你可能会做一些类似(即你计算前一个磁化强度和射频脉冲的变化并将其添加到前一个磁化矢量)ΔtM0,n+1=M0,n+ΔtγM0,n×B
  • 此操作不保留向量的长度:垂直于当你添加向量时,得到的向量比长(勾股定理)M0,n×BM0,nM0,n

因此,如果您不采取适当的对策,您的磁化矢量将会增长。也许这就是你在模拟中看到的:最后你有一个不属于那里的异常巨大的信号。您可以通过一个简单的测试轻松地检查这一点:忽略松弛并应用一个巨大的翻转角度,比如说并监控您的磁化矢量长度。当然它应该保持不变。如果没有,您的代码中可能存在错误。90000

还尝试使用旋转矩阵重新制定您的计算,并检查结果是否变得更好。