首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电容器放电--用复合函数求解微分方程

电容器放电--用复合函数求解微分方程
EN

Stack Overflow用户
提问于 2021-04-26 20:24:12
回答 2查看 116关注 0票数 0

我是个蟒蛇新手。我试着在网上寻找我的问题的解决方案,但我找不到任何解决方案。我想解一个微分方程,找出电容器在时间V(t)内的电压,当它通过自己的泄漏电流放电时。要求解的方程如下:

dV(t)/dt = I(V)/C,V(0) = V_init

其中I( V )是依赖于电容器电压V的泄漏电流。I有:作为电压、电容和初始条件的函数的泄漏电流。对测量的泄漏电流进行插值以获得V的平滑函数:

代码语言:javascript
复制
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,但我不知道如何确定电流依赖于电压,而不是时间。你能帮帮我吗?非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2021-04-26 21:08:17

![](https://chart.googleapis.com/chart?cht=tx&chl=I(V%29%20%3D%20C%5Cfrac%7BdV%7D%7Bdt%7D)

如果你把这个等式重新排列一下,你会得到

![](https://chart.googleapis.com/chart?cht=tx&chl=%5Cint%20C%20dt%20%3D%20%5Cint%20%5Cfrac%7BdV%7D%7BI(V%29%7D%0A)

因为C是一个常量

![](https://chart.googleapis.com/chart?cht=tx&chl=C%5Ccdot%20t%20%2B%20constant%20%3D%20%5Cint%20%5Cfrac%7B1%7D%7BI(V%29%7D%20dV)

现在,您可以集成

您可以使用scipy.integrate获取RHS

代码语言:javascript
复制
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

或者,如果希望将给定数据用作数组,请使用

代码语言:javascript
复制
import scipy
res = scipy.integrate.simps(I,V) #I and V are the arrays of measured data

然后,您可以使用res获得V(t),然后设置V的初始值以获得常量。

票数 0
EN

Stack Overflow用户

发布于 2021-04-28 19:16:51

我试着在没有使用复杂函数的情况下,在for循环中“手动”求解微分方程,结果比我想象的要容易。下面是我是如何实现它的:

代码语言:javascript
复制
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)

不过,我仍然很好奇是否有更干净的解决方案来解决这个问题。如果你有什么想法,请告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67266583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档