如何减少多变量方程的代码行数?

How to reduce the lines of code with multi variable equations?

我正在尝试减少代码行数,因为我意识到我每次都在重复相同的方程式。我正在编写一个等高线图并将几个强度源放入其中。到现在我放了3个源,但以后我想放更多,那会增加很多行数。所以我想看看是否可以减少“源位置”和“强度方程”的行。如您所见,最后一个等式是 z1、z2 和 z3 的对数求和,是否可以减少它,知道吗?

import numpy as np
import matplotlib.pyplot as plt

def run():
    # mesh
    N = 100
    x = np.linspace(-N, N)
    y = np.linspace(-N, N)
    X,Y = np.meshgrid(x,y)


    # sources coordinates
    p1 = [-5,-1]
    p2 = [6 , 0]
    p3 = [-10 , -8]


    # sources postions

    R1 = np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))
    R2 = np.sqrt((((p2[0]-X)**2)+((p2[1]-Y)**2)))
    R3 = np.sqrt((((p3[0]-X)**2)+((p3[1]-Y)**2)))

    # # Intensity Equation

    z1 = np.round(10 * np.log10((((((R1/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
    z2 = np.round(10 * np.log10((((((R2/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
    z3 = np.round(10 * np.log10((((((R3/(4000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0) 

    z_total = 10*np.log10((10**(z1/10))+(10**(z2/10)+(10**(z3/10))))

    # # Ploting

    Z = np.array(z_total).reshape(len(y),len(x))
    cs = plt.contourf(X,Y,Z,10)
    plt.colorbar()
    plt.show()

if __name__ =='__main__':
    run()

您可以在循环中迭代某些部分。

我试图在整体上保持相同的格式,只是重新安排了代码以展示您可以如何做。

import numpy as np
import matplotlib.pyplot as plt

def run():
    # mesh
    N = 100
    x = np.linspace(-N, N)
    y = np.linspace(-N, N)
    X,Y = np.meshgrid(x,y)

    # sources coordinates
    p = [
        [-5,-1],
        [6 , 0],
        [-10 , -8],
    ]

    # sources postions + intensity Equation
    z_log = 0
    for px, py in p:
        r = np.sqrt((((px-X)**2)+((py-Y)**2)))
        z = np.round(10 * np.log10((((((r/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
        z_log += 10**(z/10)
    z_total = 10*np.log10(z_log)

    # # Ploting
    Z = np.array(z_total).reshape(len(y),len(x))
    cs = plt.contourf(X,Y,Z,10)
    plt.colorbar()
    plt.show()

if __name__ =='__main__':
    run()

我的一个建议是展开运算符(x + y * 2 优于 x+y*2),为变量提供描述性名称(例如 coordinates 而不是 p), 并将你的计算分成更多的部分。例如,z 中有太多括号,如果某些地方无法正常工作,我不想尝试调试。

尝试在 run() 方法之外制作更小、更紧凑的函数。将它们清楚地命名为它们所做的和完成的事情(有助于提高可读性)这是一个如何使这个小功能更清晰的示例。

import numpy as np
import matplotlib.pyplot as plt

# declare 'mesh' outside of run to get from other functions
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)

def run():
   
    # sources postions
    R1 = getSourcePosition([-5,-1])
    R2 = getSourcePosition([6 , 0])
    R3 = getSourcePosition([-10 , -8])

    ...

def getSourcePosition(p1):
    # X,Y available from above declaration
    return np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))

if __name__ =='__main__':
    run()

如果这是一个更大的函数,带有 类、程序包和更多移动部件,我不会推荐全局变量,但看起来您只是想 运行 看起来像简单的脚本