2013-04-18 33 views
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) 

和條件是:
頭< = 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,巨蟒2.7.x,SciPy的0.11.0)

+1

開始的帖子「我已經有一個答案......」通常更好的問http://codereview.stackexchange.com –

+0

b可以是任何東西,這是問題的一部分。我可以結合所有的方程,但我仍然有2個變量與無限數量的解決方案。答案來自約束。我可以嘗試,但我不確定這會有幫助。 – user1523697

+0

您的約束仍然給你無限的解決方案。 – BenDundee

回答

1

你似乎只有兩個自由度在這裏---你可以在bdbtau或術語重寫一切(挑你的兩個最愛)。您對tau約束直接意味着對d約束,你可以用你的約束上Q上暗示b的約束。

而且它不看(至少對我來說,我還沒有完成我的咖啡),您的代碼做比對你已經定義了一個網格繪製一些二維功能的其它任何東西 - 不解決一個方程組。我通常理解「解決」涉及設置與其他東西相等的東西,並將一個變量寫入另一個變量的函數。

它似乎你只發佈一個片段,雖然,所以我會假設你做你的數據往下流別的東西。


好吧,我明白了。我認爲這不是一個真正的最小化問題,這是一個陰謀問題。我做的第一件事是看什麼範圍隱含bd從制約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 

然後,你可以寫其他功能還特別爲您bd,這樣你就可以這樣做:

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

或者更好的是,存儲bd如在不returnyield個功能的元組:

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

我沒有測試的代碼最後一行,我總是搞砸了這些括號,但我認爲這是正確的。

+0

當然,魔鬼對我的支持者認爲你知道所有這些,而你正在捕捉暗示而不想出現這樣做。 – BenDundee

+0

我只是在尋找一種方法來優化這類問題。也許Numpy的meshgrid功能會有所幫助。 – user1523697

+0

不要做任何事情,它下游。這是一個水力學課程的作業問題(明渠流動),目標是使用給定的方程和約束來找到通道的尺寸(b和d)。 – user1523697