而放射性衰变回路。ValueError:使用序列设置数组元素

2024-09-19 23:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

def calculateEuler(nuclei_A, nuclei_B, tau_A, tau_B, time, dt, n):
    i = 0
    while i < n-1:
        nuclei_A[i+1] = nuclei_A[i] - (nuclei_A[i]/tau_A)*dt
        nuclei_B[i+1] = nuclei_B[i] + (nuclei_A[i]/tau_A)*dt - (nuclei_B[i]/tau_B)*dt
        time[i+1] = time[i] + dt
        i = i+1
    return nuclei_A, nuclei_B, time

我试着写一个函数,当原子核(a和B)经历放射性衰变时,它近似于原子核的数量。原子核的初始数目、原子核_A[0]和原子核_B[0]已经在前面的函数中赋值

对于测线,我得到两个错误:

TypeError: only size-1 arrays can be converted to Python scalars.

ValueError: setting an array element with a sequence.

我很难理解这些错误的含义以及我做错了什么


Tags: 函数数量returntimedef错误dt经历
1条回答
网友
1楼 · 发布于 2024-09-19 23:41:59

下面的运行没有错误,每个物种在分配的时间内达到零。我没有对你的功能做任何更改。如果您发现使用不同的值初始化会破坏此代码,您可以使用此代码示例和这些值重新格式化您的问题

import numpy as np
import matplotlib.pyplot as plt

def calculateEuler(nuclei_A, nuclei_B, tau_A, tau_B, time, dt, n):
    i = 0
    while i < n-1:
        nuclei_A[i+1] = nuclei_A[i] - (nuclei_A[i]/tau_A)*dt
        nuclei_B[i+1] = nuclei_B[i] + (nuclei_A[i]/tau_A)*dt - (nuclei_B[i]/tau_B)*dt
        time[i+1] = time[i] + dt
        i = i+1
    return nuclei_A, nuclei_B, time

n = 100
A = np.zeros((n))
B = np.zeros((n))
A[0] = 10000
B[0] = 10000
tA = 1.6
tB = 2
time = np.zeros((n))
dt = .5

rA, rB, rT = calculateEuler(A, B, tA, tB, time, dt, n)

plt.figure()
plt.plot(rT, rA)

plt.figure()
plt.plot(rT, rB)

我从中得到了一点乐趣,并且能够大大加快代码的速度,除了简单之外,没有其他原因。对于1000个时间步长的模拟,上面编写的函数平均运行时间约为2.91毫秒。对于相同长度的时间数组,以下函数平均运行时间约为0.009毫秒

import numpy as np
import matplotlib.pyplot as plt
from numba import njit

@njit(nogil=True, cache=True)
def calculateEuler(nuclei_A, nuclei_B, tau_A, tau_B, dt):

    for idx in range(nuclei_A.size):
        if idx == nuclei_A.size - 1 : break
        nuclei_A[idx+1] = nuclei_A[idx] - (nuclei_A[idx]/tau_A)*dt
        nuclei_B[idx+1] = nuclei_B[idx] + (nuclei_A[idx]/tau_A)*dt - (nuclei_B[idx]/tau_B)*dt
    return nuclei_A, nuclei_B

n = 1000
A = np.zeros((n))
B = np.zeros((n))
A[0] = 1e7
B[0] = 1e7
tA = 1.6
tB = 2
dt = 0.5
time = np.arange(0, n*dt, dt)

rA, rB = calculateEuler(A, B, tA, tB, dt)

相关问题 更多 >