Python:四阶Runge-Kutta方法

Python:四阶Runge-Kutta方法,python,runge-kutta,Python,Runge Kutta,所以我对四阶龙格库塔方法进行了编码,但我要尝试的部分是,如果[2t]是偶数,则V_in(t)=1,如果[2t]是奇数,则为-1 另外,我不确定是否要返回这个等式: 返回1/RC*(V_输入-V_输出) 问题是: 如果你能帮助我,我将不胜感激 该函数应该如下所示: from math import sin from numpy import arange from pylab import plot,xlabel,ylabel,show def answer(): print('Part

所以我对四阶龙格库塔方法进行了编码,但我要尝试的部分是,如果[2t]是偶数,则V_in(t)=1,如果[2t]是奇数,则为-1

另外,我不确定是否要返回这个等式: 返回1/RC*(V_输入-V_输出)

问题是:


如果你能帮助我,我将不胜感激

该函数应该如下所示:

from math import sin
from numpy import arange
from pylab import plot,xlabel,ylabel,show
def answer():
    print('Part a:')
    print(low(x,t))
    print('First Graph')
    print('')


def low(x,t):
    return 1/RC * (V_in - V_out)

a = 0.0
b = 10.0
N = 1000
h = (b-a)/N
RC = 0.01
V_out = 0.0

tpoints = arange(a,b,h)
xpoints = []
x = 0.0

for t in tpoints:
    xpoints.append(x)
    k1 = h*f(x,t)
    k2 = h*f(x+0.5*k1,t+0.5*h)
    k3 = h*f(x+0.5*k2,t+0.5*h)
    k4 = h*f(x+k3,t+h)
    x += (k1+2*k2+2*k3+k4)/6

plot(tpoints,xpoints)
xlabel("t")
ylabel("x(t)")
show()
所以我对四阶龙格库塔方法进行了编码,但我要尝试的部分是,如果[2t]是偶数,则V_in(t)=1,如果[2t]是奇数,则为-1

您正在将
V_in
视为一个常数。问题是这是一个函数。因此,一个解决方案是使其成为一个函数!这是一个非常简单的函数:

def f(x,t):
    V_out = x
    n = floor(2*t)
    V_in = (1==n%2)? -1 : 1
    return 1/RC * (V_in - V_out)
在(t)中的
V_的定义中,您不需要或不想要
if
语句。循环内的分支代价高昂,并且该函数将从循环内多次调用。有一种简单的方法可以避免if语句

def dV_out_dt(V_out, t) :
    return (V_in(t) - V_out)/RC

def V_in(t) :
    if math.floor(2.0*t) % 2 == 0 :
        return 1
    else :
        return -1
此函数非常小,可以将其折叠为导数函数:

def V_in(t) :
    return 1 - 2*(math.floor(2.0*t) % 2)

我对问题域的了解还不够,无法为您提供适当的帮助,但我非常确定您必须为表示Vin的时间点生成一个方波(类似于生成xpoints的方式)。然后使用生成的Vin(数组)作为等式的输入来生成Vout(如何得到正确的等式我不知道:),我必须重新考虑一些数学问题)。您似乎直接使用时间点作为输入,我认为您必须首先生成方波并将其用作输入。。
def dV_out_dt(V_out, t) :
    return ((1 - 2*(math.floor(2.0*t) % 2)) - V_out)/RC