开始我已经解决了这个问题,所以这不是什么大问题,我只是要求满足自己的好奇心。问题是如何在给定一组约束的情况下求解一系列联立方程。方程是:
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 <= 0.29,Q = 10000 + - 比如3,并使b最小化
正如我所提到的,我已经能够使用一系列嵌套循环来提出解决方案:
b = linspace(320, 330, 1000)
d = linspace(0.1, 6.6392, 1000)
ansQ = []
ansv = []
anstau = []
i_index = []
j_index = []
for i in range(len(b)):
for j in range(len(d)):
tau = 62.4*d[j]*0.0007
A = (b[i] + 1.5*d[j])*d[j]
P = b[i] + 2*d[j]*sqrt(1 + 1.5**2)
R = A/P
Q = (1.486/0.03)*A*(R**(2.0/3.0))*(0.0007**0.5)
if Q >= 10000 and tau <= 0.29:
ansQ.append(Q)
ansv.append(Q/A)
anstau.append(tau)
i_index.append(i)
j_index.append(j)
这需要一段时间,我脑子里有一些东西说必须有一个更容易/更优雅的解决方案来解决这个问题。谢谢(Linux Mint 13,Python 2.7.x,scipy 0.11.0)
答案 0 :(得分:1)
你似乎在这里只有两个自由度 - 你可以用b
和d
或b
和tau
来重写所有内容,或者(选择你的)两个最爱)。您对tau
的约束直接意味着对d
的约束,您可以使用Q
上的约束来暗示对b
的约束。
它看起来(至少对我来说,我还没有完成我的咖啡)你的代码除了在你定义的网格上绘制一些二维函数之外还做其他事情 - 不解决系统问题方程式。我通常理解“解决”涉及设置与其他东西相等的东西,并将一个变量写成另一个变量的函数。
但是,您确实只发布了一个代码段,因此我假设您在下游的数据中执行其他操作。
好的,我明白了。我认为这不是一个真正的最小化问题,而是一个密谋问题。我要做的第一件事是从b
的约束中查看d
和tau
隐含的范围,然后使用它来导出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
存储为不是return
但yield
的函数中的元组:
pvals = [P(b,d) for (b,d) in thing_that_yields_b_and_d_tuples]
我没有测试最后一行代码,我总是搞砸这些括号,但我认为这是正确的。