Я относительно новичок в Python, поэтому я думаю, что это простой вопрос, но я не вижу решения. Я пытаюсь решить дифференциальное уравнение, используя неявное правило средней точки. Однако я получаю следующее сообщение об ошибке:Индекс за пределами
[email protected]:~/Desktop/progs/python/Serie 5$ python rk_Template.py
[ 0. 0.]
[ 1.84457276e-06 -1.83923593e-06]
Traceback (most recent call last):
File "rk_Template.py", line 135, in <module>
y = IntegrateIM()
File "rk_Template.py", line 129, in IntegrateIM
y0[0] = fsolve(F, y0[0] + h* y0[1])
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py",
line 139, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 196, in _root_hybr
shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 19, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "rk_Template.py", line 128, in <lambda>
F = lambda x: y0[0] - x + h*rhs(0.5*(x+y0[0]),y0[1],x[i])
IndexError: index 1 is out of bounds for axis 0 with size 1
Из того, что я узнал, что до сих пор является то, что я получаю эту ошибку, потому что массив Python получает не правильный размер, однако я не вижу, почему я получаю это ошибка. Я также заметил, что первая итерация работает, но вторая итерация прерывается.
Вот мой код:
#Constants
V0 = 5 # Volt
f = 50 # Hertz
n = 1
Is = 1 * 10**(-9) #Ampere
Vt = 0.025 #Volt
R = 100000 #Ohm
L = 0.05 #Henry
C = 10 * 10**(-9) # Farad
from numpy import *
from scipy.optimize import fsolve
def VIn(t):
Vin = V0 * sin(2*pi*f*t)
return Vin
def rhs(y1,y2,x):
dy2dt = (Is*(exp((VIn(x)-(L*y1)/(n*Vt))-1)-(L/R)*y2-y1)*(1/(C*L)))
return dy2dt
def IntegrateIM(y0=0.0,dy0=0.0,N=12001,tStart=0, tEnd = 30.0 * 10**(-3)):
x = zeros(N+1)
y0 = array([y0,dy0])
#stepsize
tEnd = float(tEnd)
h = ((tEnd - tStart)/N)
y = zeros((N+1,2))
y[0,:] = y0
y[:,0] = dy0
x[0] = tStart
for i in range(0,N):
print(y0)
x[i+1] = x[i] + h
tmp = y0[0]
F = lambda x: y0[0] - x + h*rhs(0.5*(x+y0[0]),y0[1],x[i])
y0[0] = fsolve(F, y0[0] + h* y0[1])
y0[1] = y0[1] - h*rhs(0.5*(tmp + y0[0]),y0[1],x[i])
y[i+1,:] = y0
return y
y = IntegrateIM()
Исправьте ваш отступ пожалуйста. Невозможно узнать, что будет делать код python, если мы не знаем, что такое отступы. – khelwood
Теперь исправлено намерение – Fornito
'F = лямбда x: y0 [0] - x + h * rhs (0.5 * (x + y0 [0]), y0 [1], x [i])' в этом, что Вы хотите сделать? –