2
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。

另外我不确定我是否应该返回这个等式:return 1/RC * (V_in - V_out)

这是问题所在:

问题 8.1

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

4

2 回答 2

1

因此,我对四阶龙格库塔方法进行了编码,但我试图适应的部分是如果 [2t] 为偶数则 V_in(t) = 1 或如果 [2t] 为奇数则为 -1。

您将V_in其视为常数。问题说它是一个函数。所以一个解决方案是让它成为一个函数!这是一个非常简单的函数:

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

您不需要或不希望ifV_in(t). 循环内的分支是昂贵的,并且该函数将在循环内被多次调用。有一种简单的方法可以避免该 if 语句。

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

这个函数太小了,你可以把它折叠成导函数:

def dV_out_dt(V_out, t) :
    return ((1 - 2*(math.floor(2.0*t) % 2)) - V_out)/RC
于 2015-11-26T17:11:28.660 回答
0

该函数应如下所示:

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)
于 2015-11-26T12:11:49.343 回答