首页 > 解决方案 > Python。递归矩阵乘积,结果为一组向量

问题描述

作为欧拉方法的一个应用,我正在尝试实现一个代码来计算递归矩阵乘积 Yn = Yn-1 + A(Yn-1),其中 Y 是一个向量,A 是一个矩阵,因此乘积是定义。这是我当前的代码



def f(A, y):
    return A.dot(y)


def euler(f, t0, y0, T, dt):
    t = np.arange(t0, T + dt, dt)
    y = [0,0,0,0]*len(t)
    y[0] = y0
    for i in range(1, len(t)):
        y[i] = y[i - 1] + f(A, y[i - 1])*dt
        return t, y


# Define problem specific values


A = np.array([[0, 0, 1, 0],
              [0, 0, 0, 1],
              [-2, -3, 0, 0],
              [-3, -2, 0, 0]])

y1_0 = 1
y2_0 = 2
y3_0 = 0
y4_0 = 0
y0 = [y1_0, y2_0, y3_0, y4_0]

t,y = euler(f,0,y0,2,1)

print(t,y)

例如,t0 = 0, T = 2 范围内的点的结果应该是向量 Y1 和 Y2。相反,我有

[0 1 2] [[1, 2, 0, 0], array([ 1, 2, -8, -7]), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

这里不对劲。虽然 Y1 = [1, 2, -8, -7 ] 确实出现了,但所有这些都是不必要的。Y2 根本不打印。我怀疑这是由于我如何定义变量 y。对于 t 范围内的每个点,我需要一个由 4 个零组成的向量——然后我认为它由函数 euler 填充。应该如何纠正这个?

标签: pythonmatrixdifferential-equations

解决方案


计算机总是按照您的指示去做。在您的情况下y,是通过重复 4 个零len(t)次构造的,给出 12 个零的列表。第一个列表条目被替换为 list y0。第二个列表条目被替换numpy为 a 的操作结果numpy.array。然后循环指令级别的 return 语句中断循环并返回tandy数组。y仍然包含其构造中的 10 个未替换的零。

所以构造

    y = np.zeros([len(t), len(y0)])

并修复缩进水平。


推荐阅读