替换一组函数的解

时间:2021-03-29 08:38:41

标签: python matrix sympy

我一直在尝试使用矩阵传递方法来求解光学系统。问题是我想看看矩阵的元素是否是常数。我使用 sympy 来解决矩阵的一部分,我想使用这些解决方案将它们替换为矩阵的另一个元素。我使用了 sympy.subs 但似乎不起作用。代码如下

import numpy as np
import matplotlib.pyplot as plt
from sympy import *

#all distances in mm
n1 = 1
n2 = 1.77
n = n1/n2
f1 = 200
f2 = 3.3
d = np.arange(1,300,10)
d1 = d[::-1]
d2 = f2+f1
d3 = 0.5*10**(-3)
z = symbols('z')

M2 = np.array([[1, 0], [-1/f1, 1]])
M3 = np.array([[1, d2], [0, 1]])
M4 = np.array([[1, 0], [-1/f2, 1]])
M5 = np.array([[1, d3], [0, 1]])
M6 = np.array([[1, 0], [0, n]])
M7 = np.array([[1, z], [0, 1]])

s = []
Mag =[]
for i in d1:
    M1 = np.array([[1, i], [0, 1]])
    M = np.dot(np.dot(np.dot(np.dot(M7,M6),np.dot(M5,M4)),np.dot(M3,M2)),M1)
    sol = solve(M[0,1])
    Mf = M[0,0]
    Mf = Mf.subs(z, sol)
    Mag.append(Mf)
    s.append(sol)
Mag


Output: [3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002,
 3.12250225675825e-17*z - 0.0165000000000002]

1 个答案:

答案 0 :(得分:0)

有两件事会有所帮助:

  1. 求解指定的变量。由于您想替换 z,您应该告诉 solvez 一样求解 solve(M[0,1],z)
  2. solve 的输出将是一个 z 值列表——在你的情况下看起来只有一个——而 subs 需要一个值,而不是一个列表,作为第二个参数:Mf.subs(z, sol[0])

我不使用该目录,但 SymPy 中有一个 optics directory 可能有用。

相关问题