python - Solving Integral with changing range with Python
问题描述
I'm new to python but I been working on a code which can solve an integral equation which range is also changing according the unknown parameter. I tried to use Sympy solve function but it does not return any result. I solved the problem with a for loop, but its really slow, inefficient. I'm sure there must be a better solution, a solver. Maybe there is an other approach? I'am messing up something? I attach also the code.
import sympy as sy
from sympy.solvers import solve
alphasum = 1.707
Lky = 3.078
g = 8
Ep = 195
sigp1 = 1401.927
sigp0 = 1476
e = 2.718282
u = 0.05
k = 0.007
lsl = sy.Symbol('lsl')
def lefthand(g, Ep):
return g * Ep
def rigthhand(sigp1, sigp0, e, u, alphasum, Lky, k, lsl):
return (sigp1 - (-sigp1 + 2 * sigp0 - 2 * sigp0 * (1 - e ** (-u * (((alphasum / Lky) * lsl) + k * lsl)))))
equr = (sy.integrate(rigthhand(sigp1, sigp0, e, u, alphasum, Lky, k, lsl), (lsl, 0, lsl)))
equl = lefthand(g, Ep)
print(equr)
print (equl)
print (equr-equl)
result = solve(equr-equl, lsl,warn =True,check=False,minimal=True,quick=True,simplify=True,quartics=True)
print(result)
解决方案
什么时候u
是 0 你的方程是线性的,你可以解决 if for lsl
; 让这成为 的值lsl
在 的较大值时的初始猜测u
。将您的值u
增加到目标值。让我们将大写字母U
用于我们将控制的参数,将其替换为越来越接近的值u
:
>>> U = Symbol('U')
>>> equr = (sy.integrate(rigthhand(sigp1, sigp0, e, U, alphasum, Lky, k, lsl), (lsl, 0, lsl)))
>>> equl = lefthand(g, Ep)
>>> z = equr-equl
>>> u0 = solve(z.subs(U,0),lsl)[0]
>>> for i in range(1,10): # get to u in 9 steps
... u0 = nsolve(z.subs(U,i*u/10.), u0)
>>> print(u0)
-4.71178322070344
现在定义一个更大的值u
>>> u = 0.3
>>> for i in range(1,10): # get to u in 9 steps
... u0 = nsolve(z.subs(U,i*u/10.), u0)
...
>>> u0
-2.21489271112540
我们最初的猜测(通常)会非常好,因为它是u
0 的准确时间;如果失败,那么您可能需要采取 9 个以上的步骤才能达到目标值。
推荐阅读
- android - Room - 使用 @get:Query 代替 @Query
- android - 当我使用 User-ID 进行跨平台数据分析时,为什么自定义事件报告失败?
- javascript - 如何将 javascript 函数简化为干净可读的代码?
- c++ - 优先队列函数比较
- jenkins - 重建 jenkins 作业而不进行更改显示失败状态
- python - Google colab - 有没有办法在会话期间记录峰值 RAM?
- sql - 根据特定条件从一个表中检索与另一个表相关的记录
- javascript - Discord Bot,可以间隔自动清除消息
- python - 每次出现 NaN 时如何创建运行总计并重新启动它?
- python - 如何使用从 Visual Studio Code 创建的相同环境从 Pycharm 打开项目