【问题标题】:Integrate sum of functions vs sum of integrated functions with scipy solve_ivp使用 scipy solve_ivp 积分函数总和与积分函数总和
【发布时间】:2021-01-03 11:58:55
【问题描述】:

所以我想知道:某些函数的积分之和不应该等于函数之和的积分吗?

这里我借助scipysolve_ivp整合了三个任意函数:

import numpy as np
from scipy.integrate import solve_ivp

def fun1(t, y): return 0.5 * y
def fun2(t, y): return 0.05 * y**2
def fun3(t, y): return y + 5

sol1 = solve_ivp(fun1, [0, 5], [2], rtol=1e-10, atol=1e-10)
sol2 = solve_ivp(fun2, [0, 5], [2], rtol=1e-10, atol=1e-10)
sol3 = solve_ivp(fun3, [0, 5], [2], rtol=1e-10, atol=1e-10)

print(f'{sol1.y[0][-1]} + {sol2.y[0][-1]} + {sol3.y[0][-1]} = {sol1.y[0][-1]+sol2.y[0][-1]+sol3.y[0][-1]}')

这给出了:

24.36498792283038 + 4.0000000000803775 + 1033.8921138100272 = 1062.257101732938

但另一方面:

import numpy as np
from scipy.integrate import solve_ivp

def fun(t, y): return (0.5 * y) + (0.05 * y**2) + (y + 5)

sol = solve_ivp(fun, [0, 5], [2], rtol=1e-10, atol=1e-10)

print(f'{sol.y[0][-1]}')

给予:

233176411972824.97

各位聪明人能告诉我我的思维错误吗?我的数学是错的还是我必须在 Python 中以不同的方式实现这个任务?非常感谢您的帮助!

【问题讨论】:

    标签: python numpy math scipy integral


    【解决方案1】:
    1. 的初始值是不一致的。你必须得总结初始值。
    2. 如果你总结的解决方案
    dy/dt = -y 
    dy/dt = y 
    y(0)=1
    

    你不要

    的解决方案
    dy/dt = 0 
    

    你 P>

    cos(t) + y^t
    

    但是 P>

    dy/dt = t
    dy/dt = t 
    

    你得到的解决方案 P>

    dy/dt = 2t 
    

    所以下面的代码给出一致的结果。 P>

    import numpy as np
    from scipy.integrate import solve_ivp
    
    def fun1(t, y): return 0.5 * t
    def fun2(t, y): return 0.05 * t**2
    def fun3(t, y): return t + 5
    
    sol1 = solve_ivp(fun1, [0, 5], [2], rtol=1e-10, atol=1e-10)
    sol2 = solve_ivp(fun2, [0, 5], [2], rtol=1e-10, atol=1e-10)
    sol3 = solve_ivp(fun3, [0, 5], [2], rtol=1e-10, atol=1e-10)
    
    print(f'{sol1.y[0][-1]} + {sol2.y[0][-1]} + {sol3.y[0][-1]} = {sol1.y[0][-1]+sol2.y[0][-1]+sol3.y[0][-1]}')
    
    
    def fun(t, y): return (0.5 * t) + (0.05 * t**2) + (t + 5)
    
    sol = solve_ivp(fun, [0, 5], [6], rtol=1e-10, atol=1e-10)
    
    print(f'{sol.y[0][-1]}')
    

    更新

    一般情况下,解决dy/dt=f(y,t)。的情况下dy/dt=g(t)dy/dt=h(y)不同。 P>

    如果您还没有拥有y在右边你可以简单地概括方程 P>

    dy1/dt=g1(t) 
    dy2/dt=g2(t)
    =>
    d(y1 + y2)/dt=g1(t) + g2(t)
    

    使取代y = dy1+dy2并获得 P>

    y/dt=g1(t) + g2(t)
    

    和一切按你期望的那样。您可以申请solve_ivp整个函数或其部分。 P>

    如果你有y在右侧 P>

    dy1/dt=h1(y1)
    dy2/dt=h2(y2)
    

    和总结你 P>

    d(y1 + y2)/dt=h1(y1) + h2(y2)
    

    和替代y = y1 + y2将使你一事无成。所以你不能在右侧,这种情况下分成几部分,以获得由单独整合整个结果。 P>

    【讨论】:

    • 非常感谢您的回答!事实上,您对初始值的话是非常有价值的。我希望你不介意一个问题:在FUN1,FUN2和FUN3,你为什么从y变量改为t?这难道不是改变积分厉害?事实上,我试图坚持solve_ivp的文档。有在实施例 i>的部分,y总是在示例性等式中使用。跨度>
    • @塞巴斯蒂安,y->t急剧变化方程。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2016-12-20
    • 1970-01-01
    • 2016-05-16
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多