Python 给定条件下的联立方程组

Python 给定条件下的联立方程组,python,scipy,Python,Scipy,首先,我已经解决了这个问题,所以没什么大不了的,我只是想满足我自己的好奇心。问题是如何在给定一组约束条件的情况下求解一系列联立方程组。方程式如下: tau = 62.4*d*0.0007 A = (b + 1.5*d)*d P = b + 2*d*sqrt(1 + 1.5**2) R = A/P Q = (1.486/0.03)*A*(R**(2.0/3.0))*(0.0007**0.5) 条件是: tau=10000和tau你在这里似乎只有两个自由度——你可以用b和d或b和tau或(选择你的

首先,我已经解决了这个问题,所以没什么大不了的,我只是想满足我自己的好奇心。问题是如何在给定一组约束条件的情况下求解一系列联立方程组。方程式如下:

tau = 62.4*d*0.0007
A = (b + 1.5*d)*d
P = b + 2*d*sqrt(1 + 1.5**2)
R = A/P
Q = (1.486/0.03)*A*(R**(2.0/3.0))*(0.0007**0.5)
条件是:

tau=10000和tau你在这里似乎只有两个自由度——你可以用
b
d
b
tau
或(选择你的两个最爱)重写一切。您对
tau
的约束直接意味着对
d
的约束,您可以使用对
Q
的约束来暗示对
b
的约束

而且看起来(至少在我看来,我还没有喝完咖啡)你的代码除了在你定义的网格上绘制一些二维函数之外,没有做任何其他的事情——没有解方程组。我通常理解“求解”是指将某个变量设置为等于另一个变量,并将一个变量作为另一个变量的函数来编写

不过,您似乎只发布了一个片段,所以我假设您对下游数据做了其他处理


好的,我明白了。我认为这不是一个真正的最小化问题,而是一个绘图问题。我要做的第一件事是从您对
tau
的约束中查看
b
d
的隐含范围,然后使用该范围导出对
d
的约束。然后,可以使用meshgrid(如下所述)对这些点进行网格划分,并遍历所有组合

由于在应用网格之前应用约束(而不是在代码中应用网格之后),因此只需对感兴趣的参数空间进行采样。在你的代码中,你会产生一堆你不感兴趣的垃圾,然后挑选出其中的精华。如果你先应用你的约束,你将只剩下宝石

我会将我的函数定义为:

P = lambda b, d: b + 2*d*np.sqrt(1 + 1.5**2)
这就像

>>> import numpy as np
>>> P = lambda b, d: b + 2*d*np.sqrt(1 + 1.5**2)
>>> P(1,2)
8.2111025509279791
然后您可以编写另一个函数为您提供
b
d
,这样您就可以执行以下操作:

def get_func_vals(b, d):
    pvals.append(P(b,d))
或者,更好的方法是,将
b
d
作为元组存储在一个函数中,该函数不
返回
,但
产生
s:

pvals = [P(b,d) for (b,d) in thing_that_yields_b_and_d_tuples]

我没有测试最后一行代码,我总是把这些括号弄错,但我认为这是对的。

以“我已经有了答案…”开头的帖子通常在b上问得更好,可以是任何东西,这是问题的一部分。我可以组合所有的方程,但我仍然有两个变量,有无限多的解。答案来自约束。我可以试试,但我不确定它是否有用。你的约束仍然会给你无限多的解。对,但最小化b给定Q=10000会给出一个解。我说+-3只是想说它不需要精确到10000,但这就是目标。当然,我心中的魔鬼代言人认为你知道所有这些,你在寻找暗示,而不想看起来这么做。我只是在寻找一种优化这类问题的方法。也许Numpy的网格网格函数会有所帮助。不要在下游不做任何其他事情。这是一个水力学类(明渠水流)的家庭作业问题,目标是使用给定的方程和约束条件找到渠道(b和d)的尺寸。这看起来很有希望。不幸的是,我几分钟后就要去学校了。今晚我来看看。我想你可能知道了什么。
pvals = [P(b,d) for (b,d) in thing_that_yields_b_and_d_tuples]