[英]Capacitor discharge - solve differential equation with composite function
我是 python 新手。 我試圖在 web 上尋找我的問題的解決方案,但我找不到任何問題。 我想求解一個微分方程,以在時間 V(t) 中找到電容器電壓,同時它通過自身的漏電流放電。 要求解的方程如下:
dV(t)/dt = I(V)/C, V(0) = V_init
其中I(V)是漏電流,它取決於電容電壓V。我有:漏電流為電壓、電容、初始條件的function。 對測得的漏電流進行插值,得到 V 的平滑 function:
def fitfunc(V, B, D, E):
return B*(V**E)*exp(D*V)
coeff_fit, coeffcov = scipy.optimize.curve_fit(fitfunc, forced_voltage, measured_current, p0=[1e-8, 1, 1], maxfev=50000)
V = numpy.linspace(0, 4, 100001)
I = coeff_fit[0] * (V**coeff_fit[2]) * exp(coeff_fit[1] * V)
C = 1e-9
V_init = 1
我在看 scipy.integrate.odeint 但我不知道如何明確電流取決於電壓而不是時間。 請你幫助我好嗎? 非常感謝!
如果你重新排列方程,你可以得到
由於 C 是一個常數
您現在可以集成
您可以使用scipy.integrate
來獲取 RHS
from scipy.integrate import quad
#define your I as a function of V
def I(V):
return V
res, err = quad(f, 0, 2) #limits of your V
或者,如果您想將給定的數據用作數組,請使用
import scipy
res = scipy.integrate.simps(I,V) #I and V are the arrays of measured data
然后你可以使用 res 得到 V(t) ,然后設置 V 的初始值得到常數。
我試圖在不使用復雜函數的情況下在 for 循環中“手動”求解微分方程,結果證明它比我想象的要容易。 以下是我的實現方式:
from numpy import asarray, argmin, linspace
from matplotlib.pyplot import semilogx, grid
def find_nearest(array, value):
array = asarray(array)
idx = (abs(array - value)).argmin()
return idx
V_init = 1.0 # [V]
C = 1e-9 # [F]
max_time = 1e8
dt = 1000
time = linspace(0, max_time, int(max_time/dt))
V_t = [V_init]
for time_index, instant in enumerate(time):
I_leak = I[find_nearest(V, V_t[time_index])]
dV = -dt*I_leak/C
V_t += [V_t[time_index] + dV]
semilogx(time, V_t[0:-1])
grid(True)
我仍然很好奇這個問題是否有更清潔的解決方案。 如果您有任何想法,請告訴我!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.