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()
所以我编码了四阶 runge kutta 方法,但我试图适应的部分是问题说 V_in(t( = 1 如果 [2t] 是偶数,或者如果 [2t] 是奇数,则 -1。
另外,我不确定我是否应该返回这个等式:返回 1/RC * (V_in - V_out(
问题是这样的:
问题 8.1
如果您帮助我,将不胜感激!
所以我编码了四阶 runge kutta 方法,但我试图适应的部分是问题说 V_in(t( = 1 如果 [2t] 是偶数,或者如果 [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
您不需要也不希望在V_in(t)
的定义中if
语句。循环内部的分支很昂贵,并且此函数将从循环内部多次调用。有一种简单的方法可以避免 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
该函数应如下所示:
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)