【问题标题】:Numeric solve transcendental equation in python or Matlab在 python 或 Matlab 中数值求解超越方程
【发布时间】:2025-12-25 23:25:06
【问题描述】:

我有一个欧拉-伯努利方程,我正在尝试求解:

q(x) = a*x + b + w(x)

欧拉-伯努利方程:

E * I * diff(w(x), x, x, x, x) = q(x) 

我真的不知道这是否是超验的,但我有 E、I、a、b 并且也知道我的积分限制(0 到 H)。我有 E、I、a、b 和 H 的编号。

如何获得 w(x),x 从 0 到 H 变化的点?

【问题讨论】:

  • 你是用符号方法还是用数值方法解决这个问题?这可能更适合 math.stackexchange.com
  • 我正在解决符号问题。在 math.stackexchange 中我没有声誉积分,所以我无法评论我的问题,而且一切都变得更加困难。
  • 只需使用ode45 并以数字方式求解,准确度应该非常好,因为您的变量有数字。
  • ode45 看起来就像我从文档中需要的一样。没看懂初始条件向量,是什么意思?
  • ode45 不适合求解这个方程,因为梁问题是两端至少有一条数据的边值问题。 bvp4cbvp5c 是正确的实用程序。

标签: python matlab numeric


【解决方案1】:

如果你想象征性地解决它,你可以,例如sympy:

from __future__ import division
from sympy import *
x = symbols('x')
w = symbols('w', cls=Function)
a,b,E,J =  symbols('a b E J')
equ = E*J*diff(w(x),x,4) - a*x -b - w(x)
dsolve(equ, w(x))
# This generates a function that is too generic and too big to copy-paste
# Let's make some assumptions
J = Symbol('J', real=True, positive=True)
E = Symbol('E', real=True, positive=True)
equ = E*J*diff(w(x),x,4) - a*x -b - w(x)
dsolve(equ, w(x))

导致:

               -x                 x                                                           
           ───────────       ───────────                                                      
           4 ___ 4 ___       4 ___ 4 ___                                                      
           ╲╱ E ⋅╲╱ J        ╲╱ E ⋅╲╱ J          ⎛     x     ⎞         ⎛     x     ⎞          
w(x) = C₁⋅ℯ            + C₂⋅ℯ            + C₃⋅sin⎜───────────⎟ + C₄⋅cos⎜───────────⎟ - a⋅x - b
                                                 ⎜4 ___ 4 ___⎟         ⎜4 ___ 4 ___⎟          
                                                 ⎝╲╱ E ⋅╲╱ J ⎠         ⎝╲╱ E ⋅╲╱ J ⎠          

如果提供有关边界条件的额外信息,您甚至可以进一步简化。无论如何你都需要它们,因为你还有 4 个未知系数。

【讨论】:

  • 我正在解决符号问题,因为 sympy 是我唯一知道的,想要数字,但现在我想我想要你的答案。我如何制作像你这样的 sympy draw 东西?我画的东西更难阅读。
  • 你是说漂亮的 unicode?如果您的终端支持它,请使用pretty_printing() 启用它
【解决方案2】:

让我使用 Matlab 中的符号工具箱添加一个解决方案:

syms q x w(x) a b E I
q = a*x+b+w(x);
sol = dsolve(E*I*diff(diff(diff(diff(w)))) == q)
sol_part = subs(sol,[E I],[2e5 100]) % etc.

您可以将边界条件作为单独的方程添加到dsolve 命令中,从而形成方程组。

【讨论】: