Как решить смешанные дифференциальные уравнения?Или как назначить dPsdt = o на первой итерации, и она получит значение после итераций - PullRequest
0 голосов
/ 20 декабря 2018

Ошибка генерируется следующим образом: UnboundLocalError: локальная переменная 'dPsdt', на которую ссылается перед присваиванием

dL1dt = (m_si*(h1-hf) + pi*di*alphai_1*L1*(Tm1-Ts1) - d13*dPsdt)/d11
dL2dt = (m_si*hf-m_so*hg + pi*di*alphai_2*L2*(Tm2-Ts2)- d21 * dL1dt -d23*dPsdt- 
          d24*dhodt)/d22
dPsdt = (m_so*(hg-ho) + pi*di*alphai_3*L3*(Tm3-Ts3)-d31*dL1dt-d32*dL2dt - 
        d34*dhodt)/d33
dhodt = (m_si - m_so -(d41*dL1dt) - (d42*dL2dt) - (d43*dPsdt))/d44 

dzdt = [dL1dt, dL2dt, dPsdt, dhodt, dTm1dt, dTm2dt, dTm3dt, dTp1dt, dTp2dt, dTp3dt]

return dzdt

1 Ответ

0 голосов
/ 20 декабря 2018

Кажется, что ваши производные неявно определены некой линейной системой

A*dxdt = b

, которую вы пытаетесь решить с помощью итерации Гаусса-Зейделя.Это вы должны реализовать как итерацию, то есть несколько проходов по системе уравнений.Обратите внимание, что вам нужно условие сходимости, такое как диагональное доминирование, чтобы это работало вообще.

Но для этих небольших размеров вы можете быть быстрее и точнее, используя

dxdt = nump.linalg.solve(A,b)
...