Python 3.x Euler梁,用python求解微分方程
我必须解Euler-Bernoulli微分梁方程,它是:Python 3.x Euler梁,用python求解微分方程,python-3.x,differential-equations,Python 3.x,Differential Equations,我必须解Euler-Bernoulli微分梁方程,它是: w’’’’(x) = q(x) 和边界条件: w(0) = w(l) = 0 及 光束如下图所示: 连续力q为2N/mm 我必须使用shooting方法和scipy.integrate.odeint()func 我甚至无法开始,因为我不知道如何把微分方程写成一个方程组 能理解用python求解带边界条件的微分方程的人请帮忙 谢谢:)拍摄方法 要使用放炮方法用scipy.integrate.odeint()解算四阶ODE BVP,您
w’’’’(x) = q(x)
和边界条件:
w(0) = w(l) = 0
及
光束如下图所示:
连续力q
为2N/mm
我必须使用shooting方法和scipy.integrate.odeint()
func
我甚至无法开始,因为我不知道如何把微分方程写成一个方程组
能理解用python求解带边界条件的微分方程的人请帮忙
谢谢:)拍摄方法
要使用放炮方法用scipy.integrate.odeint()
解算四阶ODE BVP
,您需要:
1.将4阶颂歌
分为4个一阶颂歌
,替换为:
u = w
u1 = u' = w' # 1
u2 = u1' = w'' # 2
u3 = u2' = w''' # 3
u4 = u3' = w'''' = q # 4
2。)创建一个函数
来执行派生逻辑
,并将该函数连接到integrate.odeint()
,如下所示:
function calc(u, x , q)
{
return [u[1], u[2], u[3] , q]
}
w = integrate.odeint(calc, [w(0), guess, w''(0), guess], xList, args=(q,))
# the current w(x) value is the previous value plus the current change of w in dx.
w(x) = w(x-dx) + dw/dx
# others are calculated the same
dw(x)/dx = dw(x-dx)/dx + d^2w(x)/dx^2
# etc.
说明:
我们将边界值条件发送到ox=0
([w(0),w'(0),w'(0),w'(0),w'(0)]
)的odeint()
),该函数调用函数calc
,该函数返回要添加到w
当前状态的导数。请注意,我们正在猜测w'(0)
和w'(0)
的初始边界条件,同时输入已知的w(0)=0
和w'(0)=0
将导数添加到w
的当前状态时如下所示:
function calc(u, x , q)
{
return [u[1], u[2], u[3] , q]
}
w = integrate.odeint(calc, [w(0), guess, w''(0), guess], xList, args=(q,))
# the current w(x) value is the previous value plus the current change of w in dx.
w(x) = w(x-dx) + dw/dx
# others are calculated the same
dw(x)/dx = dw(x-dx)/dx + d^2w(x)/dx^2
# etc.
这就是为什么我们从计算函数返回值[u[1],u[2],u[3],q]
,而不是[u[0],u[1],u[2],u[3]
,因为u[1]
是一阶导数,所以我们将其添加到w
,等等
3。)现在我们可以设置我们的拍摄方法了。我们将为w'(0)
和w'(0)
发送不同的初始边界值
到odeint()
,然后检查返回的w(x)剖面的最终结果
,以确定w(L)
和w'(L)
到0
(已知的边界条件)的接近程度
拍摄方法的程序:
要打印我们找到的w(x)
的最佳配置文件:
print(resultW[index])
其输出类似于:
# w(x) w'(x) w''(x) w'''(x)
[[ 0.00000000e+00 7.54147813e-04 0.00000000e+00 -9.80392157e-03]
[ 7.54144825e-07 7.54142917e-04 -9.79392157e-06 -9.78392157e-03]
[ 1.50828005e-06 7.54128237e-04 -1.95678431e-05 -9.76392157e-03]
...,
[ -4.48774290e-05 -8.14851572e-04 1.75726275e-04 1.01560784e-02]
[ -4.56921910e-05 -8.14670764e-04 1.85892353e-04 1.01760784e-02]
[ -4.65067671e-05 -8.14479780e-04 1.96078431e-04 1.01960784e-02]]
为了再次检查上述结果,我们还将使用数值方法求解ODE
数值方法
要使用数值方法解决这个问题,我们首先需要解微分方程。我们将得到四个常数
,我们需要借助边界条件
来找到它们。将使用边界条件
形成方程组
,以帮助找到必要的常数
w''(0) => 0 = q(x)*0.5*0^2 + C*0 + D
w''(L) => 0 = q(x)*0.5*L^2 + C*L + D
例如:
w’’’’(x) = q(x);
这意味着我们有:
d^4(w(x))/dx^4 = q(x)
由于积分后q(x)
是常数,我们有:
d^3(w(x))/dx^3 = q(x)*x + C
再次整合后:
d^2(w(x))/dx^2 = q(x)*0.5*x^2 + C*x + D
再次整合后:
dw(x)/dx = q(x)/6*x^3 + C*0.5*x^2 + D*x + E
最后,最后一次积分产生:
w(x) = q(x)/24*x^4 + C/6*x^3 + D*0.5*x^2 + E*x + F
然后我们看一下边界条件
(现在我们有上面的w'(x)
和w(x)
)的表达式),我们用它建立了一个方程组
,以求解常数
w''(0) => 0 = q(x)*0.5*0^2 + C*0 + D
w''(L) => 0 = q(x)*0.5*L^2 + C*L + D
这为我们提供了常量
:
D = 0 # from the first equation
C = - 0.01 * L # from the second (after inserting D=0)
在对w(0)=0和w(L)=0重复相同操作后,我们得到:
F = 0 # from first
E = 0.01/12.0 * L^3 # from second
现在,在我们求解了方程,找到了所有的积分常数之后,我们就可以为数值方法编制程序了
数值计算程序
我们将为每个dx
创建一个FOR
循环,一次遍历整个光束,并总结(积分)w(x)
哪些产出:
The integral of w(x) over the beam is:
0.00016666652805511192
现在比较这两种方法
打靶法与数值法的结果比较
梁上的w(x)
积分:
Shooting method -> 0.000135085272117
Numerical method -> 0.00016666652805511192
这是一个很好的匹配,现在让我们看看检查图:
从图中更明显的是,我们有一个很好的匹配,拍摄方法的结果是正确的
为了使放炮方法获得更好的结果
将xSteps
和u2_u4_maxNumbers
增加到更大的数字,您还可以将u2Numbers
和u4Numbers
缩小到相同的设置大小,但间隔更小(大约是以前程序运行的最佳结果)。请记住,设置xSteps
和u2_u4_maxNumbers
太高会导致程序运行很长时间。您需要将ODE转换为一阶系统,设置u0=w
一个可能且通常使用的系统是
u0'=u1,
u1'=u2,
u2'=u3,
u3'=q(x)
这可以实现为
def ODEfunc(u,x): return [ u[1], u[2], u[3], q(x) ]
然后生成一个函数,该函数使用实验初始条件进行触发,并返回第二个边界条件的分量
def shoot(u01, u03): return odeint(ODEfunc, [0, u01, 0, u03], [0, l])[-1,[0,2]]
现在你有了一个由两个变量和两个分量组成的函数,你需要用通常的方法求解这个2x2系统。由于系统是线性的,所以放炮函数也是线性的,您只需找到系数并求解得到的线性系统。什么是w
代表的?我想,q
是恒力吗?我编辑并纠正了我写的错误,我写了u'''(x)而不是w'''(x)。是的,q(x)是恒力。谢谢,这非常有用非常感谢。我编写代码并在shot函数中输入值,得到一个包含两个组件的列表。我的姐妹到底是什么
def shoot(u01, u03): return odeint(ODEfunc, [0, u01, 0, u03], [0, l])[-1,[0,2]]