Python 3.x Euler梁,用python求解微分方程

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,您

我必须解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
,您需要:

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]]