Определение условия в цикле while вызывает переполнение в Python, в то время как в Matlab это не будет

#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 условие цикла достигнуто, но намного раньше, чем в моем коде MatLab

4. Да, потому что «в то время как fout Я подозреваю, что вы имели в виду «пока fout > 1e-3».

5. Вы правы, я быстро изменил условие, чтобы посмотреть, не совершил ли я еще одну ошибку. Спасибо, что указали на это. Изменение условия на while fout > 1e-3 приводит к повторному переполнению