当我尝试做数学运算时,Python重新启动shell
我对以下代码有问题。我尝试了很多网页来寻找一些解决方案,但我没能找到。 问题是,当我在打印了4行之后运行这个脚本时,Python会重新启动shell。在当我尝试做数学运算时,Python重新启动shell,python,shell,kernel,jupyter,ode,Python,Shell,Kernel,Jupyter,Ode,我对以下代码有问题。我尝试了很多网页来寻找一些解决方案,但我没能找到。 问题是,当我在打印了4行之后运行这个脚本时,Python会重新启动shell。在jupyter中,它发送消息:内核似乎已死亡。它将自动重新启动。 我尝试在脚本的第一行读取一个文件,其中包含(300000)行数据。然后在计算完ODE和其他函数后,我希望打印结果以进行比较 import numpy as np from scipy.integrate import odeint from math import * from s
jupyter
中,它发送消息:内核似乎已死亡。它将自动重新启动。
我尝试在脚本的第一行读取一个文件,其中包含(300000
)行数据。然后在计算完ODE
和其他函数后,我希望打印结果以进行比较
import numpy as np
from scipy.integrate import odeint
from math import *
from scipy.integrate import quad
import math
import pandas as pd
hr, dr, cr, br = np.genfromtxt('outputs/new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
return od
def dec(H0, z, od0, c, b):
od = ant(H0, z, od0, c, b)
q = -1 - (-2 + od/(6 * c))
return q
for i in range(len(hr)):
for z in range (0,1):
print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i])
这是一个简单的代码,但我不知道最终的问题是什么。
我真的很感谢你的帮助
输入文件(new.txt
)可以是
好的,问题在于
odeint
。建议改为切换到
现在,我完全不知道这意味着什么,数学和事物的意义是我无法理解的。然而,我试图用solve_ivp最好地模仿odeint行为,它开箱即用,不接受args。现在,贫民区lambda来营救
od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1] #before
od = solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1] #after
请注意,这并不是完全的替换,solve ivp的结果以这种方式呈现一个浮点,您希望将其包装为[od]
,以完全匹配旧结果。
至于我用来缩小odeint的最小代码,你可以看到下面的战场
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
#od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1] #this solver crashed
od = solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1] #this worked out. perhaps wrap in square brackets [od] if needed.
#od = OD_H(od0,z,c,b) #this alone without the solvers worked fine
return od
#def dec(H0, z, od0, c, b): #remove the middleman
# od = ant(H0, z, od0, c, b)
# q = -1 - (-2 + od/(6 * c))
# return od
for i in range(5): #simple check instead
z = 0 #you do not need a loop here
res = ant(hr[i], z, dr[i], cr[i], br[i])
print(res)
#print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i]) print was not the culprit
不过,归根结底,我还不太清楚为什么odeint会以这种方式崩溃
编辑:
对于op,下面是代码更新的方式
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
#od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
od = [solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1]]
return od
def dec(H0, z, od0, c, b):
od = ant(H0, z, od0, c, b)
q = -1 - (-2 + od/(6 * c))
return q
for i in range(len(hr)):
for z in range (0,1):
print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i])
上述数据的输出如下所示:
[0.16771346] 71.076588184266 0.40147988209522 0.080396967668756 0.050302016457046
[0.18113212] 71.02284157687 0.39756707964421 0.080918035449145 0.050501956013259
[0.11404428] 71.102923163306 0.41587392748136 0.07823452108922 0.049336707395359
[-0.07627332] 70.860444589498 0.46748446539443 0.072392464271658 0.046667808684486
[0.03981973] 70.181278149341 0.44888833570037 0.077917371645449 0.04777288009128
[-0.13031641] 70.588452406351 0.49035265611716 0.072303154996487 0.045942096884044
[-0.13031641] 70.588452406351 0.49035265611716 0.072303154996487 0.045942096884044
[0.06395836] 70.011812869146 0.44210637315163 0.07871914246357 0.048393990901086
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.06809821] 70.123419349447 0.43961350279409 0.07862300319627 0.048607832896286
[0.14293214] 70.361666430312 0.41397677666087 0.080502527828865 0.049745843125116
[0.14293214] 70.361666430312 0.41397677666087 0.080502527828865 0.049745843125116
[0.14029196] 70.357430153315 0.41485946940097 0.08042642593323 0.049703105696664
[0.14029196] 70.357430153315 0.41485946940097 0.08042642593323 0.049703105696664
[-0.27587903] 71.551080656041 0.51047305096688 0.066682530098241 0.0446474321235
我可以用来比较的代码如下。请注意旧的odeint解算器,但仅打印了4个值
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
#od = [solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1]]
return od
def dec(H0, z, od0, c, b):
od = ant(H0, z, od0, c, b)
q = -1 - (-2 + od/(6 * c))
return q
for i in range(4): #simplified to avoid crash
for z in range (0,1):
print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i])
以及输出:
[0.16771346] 71.076588184266 0.40147988209522 0.080396967668756 0.050302016457046
[0.18113212] 71.02284157687 0.39756707964421 0.080918035449145 0.050501956013259
[0.11404428] 71.102923163306 0.41587392748136 0.07823452108922 0.049336707395359
[-0.07627332] 70.860444589498 0.46748446539443 0.072392464271658 0.046667808684486
您提供的代码并不总是生成负值。我不想理解您为什么期望或希望他们这样做,但结果应该与原始代码相匹配。好的,所以问题在于
odeint
。建议改为切换到
现在,我完全不知道这意味着什么,数学和事物的意义是我无法理解的。然而,我试图用solve_ivp最好地模仿odeint行为,它开箱即用,不接受args。现在,贫民区lambda来营救
od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1] #before
od = solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1] #after
请注意,这并不是完全的替换,solve ivp的结果以这种方式呈现一个浮点,您希望将其包装为[od]
,以完全匹配旧结果。
至于我用来缩小odeint的最小代码,你可以看到下面的战场
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
#od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1] #this solver crashed
od = solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1] #this worked out. perhaps wrap in square brackets [od] if needed.
#od = OD_H(od0,z,c,b) #this alone without the solvers worked fine
return od
#def dec(H0, z, od0, c, b): #remove the middleman
# od = ant(H0, z, od0, c, b)
# q = -1 - (-2 + od/(6 * c))
# return od
for i in range(5): #simple check instead
z = 0 #you do not need a loop here
res = ant(hr[i], z, dr[i], cr[i], br[i])
print(res)
#print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i]) print was not the culprit
不过,归根结底,我还不太清楚为什么odeint会以这种方式崩溃
编辑:
对于op,下面是代码更新的方式
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
#od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
od = [solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1]]
return od
def dec(H0, z, od0, c, b):
od = ant(H0, z, od0, c, b)
q = -1 - (-2 + od/(6 * c))
return q
for i in range(len(hr)):
for z in range (0,1):
print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i])
上述数据的输出如下所示:
[0.16771346] 71.076588184266 0.40147988209522 0.080396967668756 0.050302016457046
[0.18113212] 71.02284157687 0.39756707964421 0.080918035449145 0.050501956013259
[0.11404428] 71.102923163306 0.41587392748136 0.07823452108922 0.049336707395359
[-0.07627332] 70.860444589498 0.46748446539443 0.072392464271658 0.046667808684486
[0.03981973] 70.181278149341 0.44888833570037 0.077917371645449 0.04777288009128
[-0.13031641] 70.588452406351 0.49035265611716 0.072303154996487 0.045942096884044
[-0.13031641] 70.588452406351 0.49035265611716 0.072303154996487 0.045942096884044
[0.06395836] 70.011812869146 0.44210637315163 0.07871914246357 0.048393990901086
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.15976794] 69.807956729005 0.41349634394633 0.082020266421564 0.049900569076028
[0.06809821] 70.123419349447 0.43961350279409 0.07862300319627 0.048607832896286
[0.14293214] 70.361666430312 0.41397677666087 0.080502527828865 0.049745843125116
[0.14293214] 70.361666430312 0.41397677666087 0.080502527828865 0.049745843125116
[0.14029196] 70.357430153315 0.41485946940097 0.08042642593323 0.049703105696664
[0.14029196] 70.357430153315 0.41485946940097 0.08042642593323 0.049703105696664
[-0.27587903] 71.551080656041 0.51047305096688 0.066682530098241 0.0446474321235
我可以用来比较的代码如下。请注意旧的odeint解算器,但仅打印了4个值
import numpy as np
from scipy.integrate import odeint, solve_ivp
#from math import *
from scipy.integrate import quad
#import math
#import pandas as pd
hr, dr, cr, br = np.genfromtxt('new.txt',unpack=True)
def OD_H(od, z, c, b):
Omegai = (1-od)
div1 = np.divide(1, (1 + z), where = (1 + z)!= 0)
dMdt = -(div1) * (2 *(1-od)* (-2 + (od/(6 * c))) + 3 - 3 * b**2 * Omegai - 3 * od)
return dMdt
def ant(H0, z, od0, c, b):
z1 = 0
od = odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
#od = [solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1]]
return od
def dec(H0, z, od0, c, b):
od = ant(H0, z, od0, c, b)
q = -1 - (-2 + od/(6 * c))
return q
for i in range(4): #simplified to avoid crash
for z in range (0,1):
print(dec(hr[i], z, dr[i], cr[i], br[i]),hr[i], dr[i], cr[i], br[i])
以及输出:
[0.16771346] 71.076588184266 0.40147988209522 0.080396967668756 0.050302016457046
[0.18113212] 71.02284157687 0.39756707964421 0.080918035449145 0.050501956013259
[0.11404428] 71.102923163306 0.41587392748136 0.07823452108922 0.049336707395359
[-0.07627332] 70.860444589498 0.46748446539443 0.072392464271658 0.046667808684486
您提供的代码并不总是生成负值。我不理解您为什么期望或希望他们这样做,但结果应该与原始代码匹配。您的代码将按预期工作,只需一个小改动:避免零长度的积分间隔,如果遇到这种情况,直接返回初始值
def ant(H0, z, od0, c, b):
z1 = 0
if type(od0) is np.float64: od0 = np.array([od0]); # for uniform output
od = od0 if abs(z-z1) < 1e-15 else odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
return od
定义剂(H0、z、od0、c、b):
z1=0
如果类型(od0)是np.float64:od0=np.array([od0]);#用于均匀输出
如果abs(z-z1)<1e-15,则od=od0,否则odint(od_H,od0,[z1,z],args=(c,b))[-1]
返回od
您的代码将按预期工作,只需做一个小改动:避免零长度的积分间隔,如果遇到这种情况,直接返回初始值
def ant(H0, z, od0, c, b):
z1 = 0
if type(od0) is np.float64: od0 = np.array([od0]); # for uniform output
od = od0 if abs(z-z1) < 1e-15 else odeint(OD_H, od0, [z1, z], args=(c, b))[-1]
return od
定义剂(H0、z、od0、c、b):
z1=0
如果类型(od0)是np.float64:od0=np.array([od0]);#用于均匀输出
如果abs(z-z1)<1e-15,则od=od0,否则odint(od_H,od0,[z1,z],args=(c,b))[-1]
返回od
创建一个不同的new.txt副本,其中只包含30行数据或其他内容。如果它加载,您可以确认我的猜测:这很可能是因为您没有足够的ram来保存所有数据。这只是一个典型的内存问题。@Paritossingh是的,我以前曾尝试过一些有这个问题的计算,在添加了4 GB额外的ddr3 RAM之后,我的问题就解决了。但现在我有8GB内存。但现在让我来做你的建议。等等…@Paritossingh不,一个文本文件又有17行了,我也有同样的问题。你能提供最小的输入,仍然允许复制这个问题吗?@Paritossingh你是什么意思,我抓不到它创建一个新的.txt副本,只有30行数据或其他东西。如果它加载,您可以确认我的猜测:这很可能是因为您没有足够的ram来保存所有数据。这只是一个典型的内存问题。@Paritossingh是的,我以前曾尝试过一些有这个问题的计算,在添加了4 GB额外的ddr3 RAM之后,我的问题就解决了。但现在我有8GB内存。但现在让我来做你的建议。等等…@Paritossingh不,一个文本文件又有17行,我也有同样的问题。你能提供最小的输入,仍然允许复制这个问题吗?@Paritossingh你是什么意思,在我问一个问题之前,我听不懂。如果使用
def dec()
函数,则打印的结果为正
,而全部结果必须为负。当然,这样我就不知道最后的答案了。我的意思是它们是错误的结果如果结果是错误的,那么它们就是你给出的代码的结果。你必须检查方程的逻辑等等。检查更新,看看这是否给你任何线索@恐怕我无法帮助你理解所有数学运算背后的逻辑。不,不,代码是正确的,即使在前面的代码中,我们可以看到5行的负值。但是这个代码的答案是完全肯定的。使用此代码