0

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

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)

4

1 回答 1

1

你在这里似乎只有两个自由度——你可以用band dorbtauor 重写所有东西(选择你最喜欢的两个)。您对tau的约束直接意味着对 的约束d,并且您可以使用对 的约束Q来暗示对 的约束b

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

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


好的我明白了。我认为这不是一个真正的最小化问题,而是一个绘图问题。b我要做的第一件事是d查看taud. 然后,您可以使用 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

然后,您可以编写另一个函数来为您服务bd因此您可以执行以下操作:

def get_func_vals(b, d):
    pvals.append(P(b,d))

或者,更好的是,将bd作为元组存储在一个不是returnyields 的函数中:

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

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

于 2013-04-18T14:12:24.047 回答