向非线性方程组添加约束

adding constraints to system of nonlinear equations

这是我关于 Whosebug 的第一个问题。对不起,如果它有点笨拙。

我正在尝试求解描述分层土壤中梁的静态平衡。就作用在梁上的力而言,存在一些外力,并且存在土壤对该力的反作用力。行动和反应显然必须平衡。反作用力是不同层上土壤综合作用力的总和。土壤作为位移的函数非线性响应。基本上,这个特定的平衡是一个标量,因为它只是反应 = 作用的总和。

另一方面,梁内的内力还必须与作用在相关梁单元上的局部力相平衡。假设我们有 40 个这样的元素。所以简而言之,我面临的问题如下:

我需要找到 F1(x1,x2,...x40) 的根,其中 x1,x2...x40 描述了桩在土壤中的位移。我通过了对位移的初始猜测,然后 Fsolve 返回一个向量长度 40,它给出 F1 = [0,0...0].. 所以这基本上平衡了内力和梁上的局部力(实际上是曲率与力矩)。

问题是我似乎无法添加额外的约束,即我上面描述的全局平衡,因为这违反了 fsolve 中输出向量长度必须等于输入向量长度的条件。我似乎无法在 Fsolve 中添加此类约束。我也采用了优化方式,您可以在其中添加约束,但这不起作用,因为它优化了标量,并且不适用于向量根。

也许我只是漏掉了一些愚蠢的东西,但我已经在 Whosebug 上搜索了几天,但还是徒劳无功。我可能可以用微分方程求解器来解决它,但如果我能避免的话,出于各种原因我不想那样做。 任何能给我一个新角度的东西都会有所帮助! python 的全新内容,所以我非常感谢我迄今为止阅读的所有有用的解决方案,即使它并没有让我到达那里。

通常,我们有n个方程和n个变量,即一个平方系统。如果解不是唯一的,则意味着您的方程不是独立的。添加额外约束时,您不能再使用方形系统求解器。但是,很有可能使用非线性优化求解器。例如。我们可以写:

 min 0
 subject to 
      F(x) = 0   (n equations) 
      G(x) = 0   (additional constraints)

如果你想要一个接近的解,你可以增加松弛度并最小化误差平方和:

 min ||s|| + ||t||
 F(x) = s
 G(x) = t

我经常使用这种方法。