#python #overflow
Вопрос:
Я работал над заданием для школы. Мне нравится начинать писать свой код в Matlab, если у меня возникают проблемы с использованием синтаксиса в Python из-за того, что я новичок в использовании Python. В настоящее время мой код на Python вызывает переполнение и недопустимые значения. Таким образом, я закодировал его в Matlab, но, похоже, это работает в Matlab, поэтому я почти уверен, что то, как я вычисляю свое условие для цикла while в Python, неверно, но я, похоже, не могу понять это правильно.
В настоящее время у меня есть MRE, который приводит к этой проблеме:
import numpy as np
import matplotlib.pyplot as plt
#evenwicht = reactie 2
#aA bB -> cC -> dD eE
#cC -> dD eE
a = 1 ;b = 2 ;c = 3; d = 1; e = 2
t0 = 0
t_eind = 10
dt = 0.05
t = np.arange(t0, t_eind, dt)
n = len(t)
fout = 1
M = 1
Ca = np.zeros(n);
Cb = np.zeros(n); Cc = np.zeros(n);
Ca[0] = a; Cb[0] = b
Cc[0] = 0;
k1 = 1
def rA(Ca, Cb, Cc, t):
-k1 * Ca**a * Cb**b
return -k1 * Ca**a * Cb**b
while fout > 1e-3:
t = np.arange(t0, t_eind, dt)
n = len(t)
for i in range(0,n-1):
Ca[i 1] = Ca[i] rA(Ca[i], Cb[i], Cc[i], t[i]) * dt
fout = abs((M-Ca[n-1])/M)
M = Ca[n-1]
dt = dt/2
plt.plot(t,Ca);
plt.grid()
plt.autoscale()
plt.show()
Я совершенно уверен, что это связано с линиями error = abs((M-Ca[-1])/M)
, M = Ca[-1]
которые я запрограммировал в MatLab следующим образом: error = abs((M-Ca(end))/M)
и M = Ca[end]
. Я чувствую, что то, как я пытаюсь соединить последнее вычисленное значение в массиве для Ca
в моем for
цикле, неверно, но в Интернете все, что я мог найти, — это либо поместить -1
в соединение, либо вызвать len(Ca)
и захватить последнее, добавив -1
его в конец.
Код ошибки, который я получаю, выглядит так:
`<ipython-input-11-27cf4afbd18d>:20: RuntimeWarning: overflow encountered in double_scalars
-k1 * Ca**a * Cb**b * dt
<ipython-input-11-27cf4afbd18d>:20: RuntimeWarning: invalid value encountered in double_scalars
-k1 * Ca**a * Cb**b * dt`
Что заставляет меня думать, что мое условие цикла while никогда не будет достигнуто. От меня требуется использовать for
цикл внутри while
цикла.
Комментарии:
1. Я не совсем уверен, что вы хотите сделать, и код еще не является рабочим примером (например. Cb и Cc не инициализированы) Но, может быть, вы забыли сбросить M=1 внутри цикла? И диапазон(0,n-1) = [0, 1, …, n-2]. Я думаю,вы хотите сделать диапазон(0, n)
2. Эй, Дуайт, это странно, я запустил код перед публикацией, и он выдал мне ошибку, которую я опубликовал, но теперь, похоже, она сломалась. Я отредактирую сообщение, как только выясню, что произошло. Чего я пытаюсь добиться, так это создать профиль концентрации определенной реакции, который показан в комментариях в первых строках кода.
3. Я отредактировал код, теперь мое
while
условие цикла достигнуто, но намного раньше, чем в моем коде MatLab4. Да, потому что «в то время как fout Я подозреваю, что вы имели в виду «пока fout > 1e-3».
5. Вы правы, я быстро изменил условие, чтобы посмотреть, не совершил ли я еще одну ошибку. Спасибо, что указали на это. Изменение условия на
while fout > 1e-3
приводит к повторному переполнению