首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python问题:系数是函数的常微分方程系统的参数估计

Python问题:系数是函数的常微分方程系统的参数估计
EN

Stack Overflow用户
提问于 2021-05-17 09:07:17
回答 1查看 52关注 0票数 0

我的模型是常微分方程系统,系数是具有参数的函数。

我的目标是系数中的参数估计。

代码语言:javascript
运行
AI代码解释
复制
dC1dt = c_11(t)*C1 + c_12(t)*C2

dC2dt = c_22(t)*C2 + c_22(t)*C2

我知道如何用R来解决它,但我必须用Python来解决它。

首先,我尝试在固定条件下使用odeint。

完整代码:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

# fixed values
V_room = 40 #room volume[m^3]
v = 0.01 #velocity of material [m/s]
h = 2.5 # height of room [m/s]
Q = 1 # average flux [m^3/min]
V_0 =1 # initial value of nf [m^3]
Q_0 = 0.1 #initial value of Q_ff

#initial values 
C_0 = [0.0002, 2e-05]

#parameter 
k= 0.06       
beta = 0.001
alpha = 0.005

# measured time
ts = np.linspace(0,60,60)
# fixed functions

def V_nf(t):
    return V_0 + (V_room - V_0)*(1-np.exp(-alpha*t))

def V_ff(t):
    return V_room - V_nf(t)

def dVnf(t):
    return alpha*(V_nf(t)-V_0)

def dVff(t):
    return -dVnf(t)

def S_nf(t):
    return V_nf(t)**(2/3)

def Q_ff(t):
    return Q_0*np.exp(-beta*t)

=====

代码语言:javascript
运行
AI代码解释
复制
coefficients = {'coef_11' : coef11, 'coef_12' : coef12, 'coef_21' : coef21, 'coef_22' : coef22}

def coef11(t):
    return (-k*S_nf(t)-dVnf(t))/V_nf(t) - Q/V_room - v/h

def coef12(t):
    return (k*S_nf(t)+Q_ff(t))/V_nf(t) - Q*V_ff(t)/(V_room * V_nf(t))

def coef21(t):
    return k*S_nf(t)/V_ff(t)

def coef22(t):
    return (-dVff(t)-Q_ff(t)-k*S_nf(t))/V_ff(t) - v/h

def dCdt(C,t):
    
    C_nf = C[0]
    C_ff = C[1]
    c_11 = coefficients['coef_11'](t)
    c_12 = coefficients['coef_12'](t)
    c_21 = coefficients['coef_21'](t)
    c_22 = coefficients['coef_22'](t)
    
    dCnf = c_11* C_nf + c_12 * C_ff
    dCff = c_21* C_nf + c_22 * C_ff
    
    return [dCnf, dCff]

C = odeint(dCdt, C_0, ts, args= (coefficients,))

然而,我得到了

代码语言:javascript
运行
AI代码解释
复制
TypeError                                 Traceback (most recent call last)
<ipython-input-114-7cece3e6a166> in <module>
     13     return [dCnf, dCff]
     14 
---> 15 C = odeint(dCdt, C_0, ts, args= (coefficients,))

~\Anaconda3\lib\site-packages\scipy\integrate\odepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)
    242                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
    243                              ixpr, mxstep, mxhnil, mxordn, mxords,
--> 244                              int(bool(tfirst)))
    245     if output[-1] < 0:
    246         warning_msg = _msgs[output[-1]] + " Run with full_output = 1 to get quantitative information."

TypeError: dCdt() takes 2 positional arguments but 3 were given

我不知道这种方法是否正确,也不知道为什么会发生这种问题。

正如我所说的,我的目标是估计参数(k,alpha,beta)。

因此,如果你知道如何做到这一点,就使用数据。

数据:

代码语言:javascript
运行
AI代码解释
复制
C1 = array([2.00000e-04, 3.52006e+00, 1.01378e+00, 8.47760e-01, 6.19000e-01,
   6.09940e-01, 4.35010e-01, 3.49150e-01, 3.87830e-01, 3.24830e-01,
   1.97040e-01, 1.84630e-01, 1.72520e-01, 1.35980e-01, 1.38430e-01,
   1.21520e-01, 1.46680e-01, 9.08900e-02, 1.09650e-01, 8.71000e-02,
   9.24400e-02, 1.11200e-01, 7.96600e-02, 9.26300e-02, 8.08700e-02,
   8.04000e-02, 7.69200e-02, 9.06400e-02, 7.30600e-02, 7.22200e-02,
   6.57900e-02, 7.87200e-02, 7.67700e-02, 7.28100e-02, 6.65600e-02,
   6.87300e-02, 7.65600e-02, 6.87200e-02, 7.52700e-02, 8.66000e-02,
   6.90700e-02, 6.51900e-02, 5.39200e-02, 6.46600e-02, 5.96400e-02,
   6.90100e-02, 6.23700e-02, 1.00230e-01, 9.05900e-02, 4.96300e-02,
   6.75400e-02, 5.50200e-02, 4.75700e-02, 5.82800e-02, 5.34400e-02,
   5.30200e-02, 4.10700e-02, 4.10800e-02, 4.91300e-02, 4.16300e-02])

C2 = array([5.000e-05, 2.000e-05, 1.000e-04, 1.250e-03, 1.500e-03, 2.630e-03,
   2.600e-04, 5.540e-03, 2.160e-03, 9.420e-03, 8.030e-03, 1.369e-02,
   9.620e-03, 1.527e-02, 1.209e-02, 9.600e-03, 1.081e-02, 1.414e-02,
   1.522e-02, 1.244e-02, 2.223e-02, 2.312e-02, 2.683e-02, 2.398e-02,
   2.658e-02, 2.841e-02, 2.123e-02, 3.052e-02, 3.349e-02, 4.027e-02,
   3.110e-02, 3.134e-02, 3.185e-02, 2.964e-02, 4.078e-02, 2.530e-02,
   4.443e-02, 2.856e-02, 2.459e-02, 2.568e-02, 2.104e-02, 2.477e-02,
   2.297e-02, 2.512e-02, 2.133e-02, 2.002e-02, 1.427e-02, 3.033e-02,
   1.946e-02, 2.173e-02, 1.800e-02, 1.346e-02, 2.039e-02, 2.132e-02,
   1.416e-02, 1.376e-02, 1.079e-02, 6.640e-03, 1.324e-02, 1.056e-02])
EN

回答 1

Stack Overflow用户

发布于 2021-05-27 19:09:42

因为您在dCdt函数的定义中忘记了一个参数,所以您将获得TypeError。应该是def dCdt(C,t,coefficients):

对于参数优化,有许多不同的方法和途径。你在R中使用了什么方法?在python中找到好的参数的最简单方法之一是使用scipy.optimize.minimize最小化平方误差总和。

代码语言:javascript
运行
AI代码解释
复制
def SumSquaredErr(x):
    k,alpha,beta = x
    
    # Insert all your function definitions here #
    
    C = odeint(dCdt, C_0, ts, args= (coefficients,))

    return ((C[1:,0] - C1)**2).sum() + ((C[1:,1] - C2)**2).sum()

x0 = [k,alpha,beta] # your best guess for the parameter values
bounds = [(None,None),(0,None),(None,None)] # alpha>0 so V_nf!=0
res = minimize(SumSquaredErr, x0, bounds=bounds)
print('best [k,alpha,beta]: ', res.x)

我在这里假设ts = np.linspace(0,60,61),C1和C2是时间ts[1:]的数据,即1,2,3,...,59,60。

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

https://stackoverflow.com/questions/67566857

复制
相关文章
常微分方程初值问题数值解法MATLAB(泛函微分方程)
高对差分格式的认识和离散化分析问题的技巧,加深对理论课程的学习和理解,为数学专业和信息与计算科学专业其他后继课程的学习打好基础。
全栈程序员站长
2022/07/28
9030
matlab解常微分方程组数值解法(二元常微分方程组的解法)
上篇博客介绍了Matlab求解常微分方程组解析解的方法:博客地址 微分方程组复杂时,无法求出解析解时,就需要求其数值解,这里来介绍。 以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档)
全栈程序员站长
2022/08/01
4.9K0
matlab解常微分方程组数值解法(二元常微分方程组的解法)
使用Maxima求解常微分方程~
含带导数符号或带微分符号的未知函数的方程称为微分方程。 如果在微分方程中未知函数是一个变元的函数,这样的微分方程称为常微分方程。
Enjoy233
2019/03/05
1.7K0
使用Maxima求解常微分方程~
matlab中通过ode函数求解常微分方程附加简单的钟摆模型
求解常微分方程常用matlab中的ode函数,该函数采用数值方法用于求解难以获得精确解的初值问题。ODE是一个包含一个独立变量(例如时间)的方程以及关于该自变量的一个或多个导数。在时域中,ODE是初始值问题,因此所有条件在初始时间t=0指定。
用户9925864
2022/12/16
1.8K0
matlab中通过ode函数求解常微分方程附加简单的钟摆模型
4.3 差分与简单常微分方程初值问题
什么是差分运算?如下图,数值计算过程我们计算函数上某点的导数时,可以选择某点附近(可以包含该点)的两个点,取这两个点的斜率来近似表示该点的导数。一阶导数有一阶向前差分、一阶向后差分和一阶中心差分。当然也有二阶导数的计算方法,如下图。
周星星9527
2018/08/08
1.5K0
4.3 差分与简单常微分方程初值问题
【数字信号处理】线性常系数差分方程 ( “ 线性常系数差分方程 “ 与 “ 线性时不变系统 “ 关联 | 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 线性时不变系统方法 )
根据上一篇博客 【数字信号处理】线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 ) 中 , 得出如下结论 :
韩曙亮
2023/03/30
1K0
一份简短又全面的数学建模技能图谱:常用模型&算法总结
本文总结了常用的数学模型方法和它们的主要用途,主要包括数学和统计上的建模方法,关于在数学建模中也挺常用的机器学习算法暂时不作补充,以后有时间就补。至于究竟哪个模型更好,需要用数据来验证,还有求解方法也不唯一,比如指派问题,你可以用线性规划OR动态规划OR整数规划OR图与网络方法来解。
全栈程序员站长
2022/07/23
3.9K0
一份简短又全面的数学建模技能图谱:常用模型&算法总结
数值积分法求解常微分方程
Scipy 的 integrate 模块的 odeint 函数可以用来以数值积分法求解常微分方程。
用户6021899
2023/03/03
5050
数值积分法求解常微分方程
一阶常微分方程方向场图的绘制
方向场图可用于可视化一阶常微分方程的可能解。方向场图由XY平面网格中未知函数斜率的短线组成。y(x) 在XY平面上任意一点的斜率由微分方程
用户6021899
2023/03/03
1.3K0
一阶常微分方程方向场图的绘制
神经网络常微分方程 (Neural ODEs) 解析
在本文中,我将尝试简要介绍一下这篇论文的重要性,但我将强调实际应用,以及我们如何应用这种需要在应用程序中应用各种神经网络。
AI科技评论
2019/08/15
7.1K1
matlab中ode45函数解二阶微分方程_matlab求常微分方程组
求解单变量微分方程的解 x ˙ ( t ) = 2 ∗ x ( t ) \dot{x}(t) = 2 * x(t) x˙(t)=2∗x(t)
全栈程序员站长
2022/11/03
3.8K0
「精挑细选」精选优化软件清单
给定一个输入和输出值之间的转换,描述一个数学函数f,优化处理生成和选择一个最佳解决方案从一些组可用的替代方案,通过系统地选择输入值在一个允许集,计算的输出功能,录音过程中发现的最好的输出值。许多实际问题都可以用这种方法建模。例如,输入可以是电机的设计参数,输出可以是功耗,或者输入可以是业务选择,输出可以是获得的利润。
架构师研究会
2020/08/28
5.8K0
「精挑细选」精选优化软件清单
数学建模暑期集训5:matlab求解常微分方程/偏微分方程
功能函数:ode45,ode23,ode113 例:用RK方法(四阶龙格—库塔方法)求解方程 f=-2y+2x^2+2*x
zstar
2022/06/14
1.2K0
数学建模暑期集训5:matlab求解常微分方程/偏微分方程
【数字信号处理】线性常系数差分方程 ( 卷积 与 “ 线性常系数差分方程 “ | 使用 matlab 求解 “ 线性常系数差分方程 “ )
" 线性常系数差分方程 " 不能使用 卷积函数 conv 函数进行求解 , 因为卷积的右侧没有
韩曙亮
2023/03/30
6580
【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例 | 根据 “ 线性时不变系统 “ 定义证明 )
参考 【数字信号处理】线性常系数差分方程 ( “ 线性常系数差分方程 “ 与 “ 线性时不变系统 “ 关联 | 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 线性时不变系统方法 ) 中提出的方法 , 根据
韩曙亮
2023/03/30
7640
【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例 | 使用递推方法证明 )
参考 【数字信号处理】线性常系数差分方程 ( “ 线性常系数差分方程 “ 与 “ 线性时不变系统 “ 关联 | 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 线性时不变系统方法 ) 中提出的方法 , 根据
韩曙亮
2023/03/30
7800
数学|如何求解线性方程系数?
线性方程在生活的出现的比例很高,很多地方都可以出现它的身影。这些方程都是通过对实际数据的分析处理得来的,那么这些方程到底该如何确定呢?就像下面的散点图,如何通过它得到一个线性方程?
算法与编程之美
2020/04/15
1.1K0
数值计算方法 Chapter8. 常微分方程的数值解
梯形公式本质上依然还是基于微分差商,不过不同于之前直接使用微分的形式,这里更加严格的使用了积分的表达,即:
codename_cys
2022/08/23
2.8K0
【数字信号处理】线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )
如果 " 线性常系数差分方程 " 的 " 初始条件 " 不确定 , 则其相应的 " 解 " 也不能确定 ;
韩曙亮
2023/03/30
7880
点击加载更多

相似问题

基于GEKKO的常微分方程系统参数估计

126

如何用Matlab估计常微分方程系统的系数

13

python (odeint)中含时系数常微分方程的求解

27

解带分段系数的常微分方程

128

具有时变系数的scipy常微分方程

117
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文