我是个蟒蛇新手。我试着在网上寻找我的问题的解决方案,但我找不到任何解决方案。我想解一个微分方程,找出电容器在时间V(t)内的电压,当它通过自己的泄漏电流放电时。要求解的方程如下:
dV(t)/dt = I(V)/C,V(0) = V_init
其中I( V )是依赖于电容器电压V的泄漏电流。I有:作为电压、电容和初始条件的函数的泄漏电流。对测量的泄漏电流进行插值以获得V的平滑函数:
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,但我不知道如何确定电流依赖于电压,而不是时间。你能帮帮我吗?非常感谢!
发布于 2021-04-26 21:08:17

如果你把这个等式重新排列一下,你会得到
因为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的初始值以获得常量。
发布于 2021-04-28 19:16:51
我试着在没有使用复杂函数的情况下,在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)不过,我仍然很好奇是否有更干净的解决方案来解决这个问题。如果你有什么想法,请告诉我!
https://stackoverflow.com/questions/67266583
复制相似问题