2015-11-26 327 views
1
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() 

所以我的四阶龙格库塔方法进行编码,但我想,以适应部分是哪里出了问题说V_IN(T)= 1,如果[2吨]是偶数或-1如果[2t]是奇数。的Python:四阶龙格 - 库塔法

另外,我不知道如果我想回到这个等式: 回1/RC *(V_IN - V_OUT)

现在的问题是:

Problem 8.1

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

+0

我不知道有足够的了解问题域正确地帮助你,但我敢肯定你必须为您的时间点生成一个表示Vin的方波(类似于您生成x点的方式)。并使用生成的Vin(数组)作为公式的输入来生成Vout(如何得到正确的方程我不知道:)我将不得不重新审视一些数学)。您似乎直接将时间点用作输入,我认为您必须首先生成方波并将其用作输入。 –

回答

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) 
0

所以我的四阶龙格库塔方法进行编码,但我想,以适应部分是哪里出了问题说V_IN(T)如果[2t]是偶数,则= 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 

你不需要或不想要的if声明的V_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