簡體   English   中英

我怎樣才能簡化代碼?

[英]How can i simplify the codes?

我根據代碼繪制了一些圖表。 但我認為這太復雜了。 我怎樣才能簡化odeint、數組和打印代碼 我需要in代碼中使用for嗎? 盡管我已經嘗試in代碼中使用for來簡化代碼,但我無法完全理解在這種情況下如何in代碼中使用for

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import math

def dy_dx(y,x,z):
    c_1 = 5.0 / (1.38 * 1223.0 * pow(10.0, 28.0)*pow(z,3.0))
    c_2 = 600000
    c_3 = 9.5*pow(10,19)
    c_4 = 9.5*pow(10,10)
    c_5 = pow(600000,2.7)
    return (c_1 * (y/math.sqrt(1.0+pow(y, 2.0)) ) * (((1.0-pow(y, 3.0))/(z* pow(y,(1.0/3.0)))) - (y * c_2)))-(((3*y*(c_3)*np.exp(-36*1570/1223)))/((2*pow(c_4,2.7)))*(c_5))

xs = np.linspace(0, pow(10.0, 12.0), pow(10.0, 6.0))
y_0 = 1.0
z = 0.000001
y1 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000002
y2 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000003
y3 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000004
y4 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000005
y5 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000006
y6 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000007
y7 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000008
y8 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.000009
y9 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00001
y10 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00002
y11 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00003
y12 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00004
y13 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00005
y14 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00006
y15 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00007
y16 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00008
y17 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00009
y18 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.0001
y19 = odeint(dy_dx, y_0, xs, args=(z,))
z = 0.00011
y20 = odeint(dy_dx, y_0, xs, args=(z,))


y1 = np.array(y1).flatten()
y2 = np.array(y2).flatten()
y3 = np.array(y3).flatten()
y4 = np.array(y4).flatten()
y5 = np.array(y5).flatten()
y6 = np.array(y6).flatten()
y7 = np.array(y7).flatten()
y8 = np.array(y8).flatten()
y9 = np.array(y9).flatten()
y10 = np.array(y10).flatten()
y11 = np.array(y11).flatten()
y12 = np.array(y12).flatten()
y13 = np.array(y13).flatten()
y14 = np.array(y14).flatten()
y15 = np.array(y15).flatten()
y16 = np.array(y16).flatten()
y17 = np.array(y17).flatten()
y18 = np.array(y18).flatten()
y19 = np.array(y19).flatten()
y20 = np.array(y20).flatten()

print(np.interp(pow(8,12),xs,y1))
print(np.interp(pow(8,12),xs,y2))
print(np.interp(pow(8,12),xs,y3))
print(np.interp(pow(8,12),xs,y4))
print(np.interp(pow(8,12),xs,y5))
print(np.interp(pow(8,12),xs,y6))
print(np.interp(pow(8,12),xs,y7))
print(np.interp(pow(8,12),xs,y8))
print(np.interp(pow(8,12),xs,y9))
print(np.interp(pow(8,12),xs,y10))
print(np.interp(pow(8,12),xs,y11))
print(np.interp(pow(8,12),xs,y12))
print(np.interp(pow(8,12),xs,y13))
print(np.interp(pow(8,12),xs,y14))
print(np.interp(pow(8,12),xs,y15))
print(np.interp(pow(8,12),xs,y16))
print(np.interp(pow(8,12),xs,y17))
print(np.interp(pow(8,12),xs,y18))
print(np.interp(pow(8,12),xs,y19))
print(np.interp(pow(8,12),xs,y20))




plt.rcParams.update({'font.size': 10})
plt.ylim(0,1.0)
plt.xlabel("x")
plt.ylabel("y")
plt.plot(xs, y1, 'r-')
plt.plot(xs, y2, 'b-')
plt.plot(xs, y3, 'g-')
plt.grid(True)
plt.show()

雖然您的代碼很長並且需要一些時間來閱讀它,但它非常簡單。 通過使用字典來跟蹤您的 y 值和重復行的一些 for 循環,可以使它變得更簡單,如下所示 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import math

def dy_dx(y,x,z):
    c_1 = 5.0 / (1.38 * 1223.0 * pow(10.0, 28.0)*pow(z,3.0))
    c_2 = 600000
    c_3 = 9.5*pow(10,19)
    c_4 = 9.5*pow(10,10)
    c_5 = pow(600000,2.7)
    return (c_1 * (y/math.sqrt(1.0+pow(y, 2.0)) ) * (((1.0-pow(y, 3.0))/(z* pow(y,(1.0/3.0)))) - (y * c_2)))-(((3*y*(c_3)*np.exp(-36*1570/1223)))/((2*pow(c_4,2.7)))*(c_5))

xs = np.linspace(0, pow(10, 12), pow(10, 6))
y_0 = 1.0


zVals = [0.000001, 0.000002, 0.000003, 0.000004, 0.000005, 0.000006, 0.000007, 0.000008, 0.000009, 0.00001, 0.00002, 0.00003, 0.00004, 0.00005, 0.00006, 0.00007, 0.00008, 0.00009, 0.0001, 0.00011]

yDict = {}

for i in range(1,21):
    z = zVals[i-1]
    yDict["y{0}".format(i)] = odeint(dy_dx, y_0, xs, args=(z,))

for y in yDict:
    yDict[y] = np.array(yDict[y]).flatten()
    print(np.interp(pow(8,12),xs,yDict[y]))

plt.rcParams.update({'font.size': 10})
plt.ylim(0,1.0)
plt.xlabel("x")
plt.ylabel("y")
plt.plot(xs, yDict['y1'], 'r-')
plt.plot(xs, yDict['y2'], 'b-')
plt.plot(xs, yDict['y3'], 'g-')
plt.grid(True)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM