向非线性方程组添加约束

2024-05-15 22:50:43 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我关于stackoverflow的第一个问题。如果有点笨拙,我很抱歉

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

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

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

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

也许我只是错过了一些愚蠢的事情,但几天来我一直在徒劳地搜寻stackoverflow。我可能可以用微分方程解算器来解,但如果可以避免的话,出于各种原因,我不想这样做。 任何能给我一个新角度的东西都会有帮助!python是一个全新的工具,所以我非常感谢迄今为止我读到的所有有用的解决方案,即使它并没有让我达到目的


Tags: 局部stackoverflow向量f1x1x2标量土壤
1条回答
网友
1楼 · 发布于 2024-05-15 22:50:43

通常,我们有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

我经常使用这种方法

相关问题 更多 >