2015-11-26 42 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