簡體   English   中英

電容器放電 - 用復合 function 求解微分方程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM