2017-10-08 88 views
1

我正在嘗試進行數學模擬以查找條件滿足時的情況。我的方法是定義條件並製作一個增加x和y值的while循環。請參閱下面的代碼:使用範圍內的所有值計算函數?

# Initialize the variables. 

x1list = [] 
y1list = [] 
x2list = [] 
y2list = [] 

x = 0 
y = 0 
i = 0 

while i < 10: 

    # Update data. 
    i += 1 
    x += .1 
    y += .1 

    func1 = x + y - 1 
    func2 = x * y 

    cond1 = func1 < func2 < 1 

    if cond1: 
    x1list.append(x) 
    y1list.append(y) 

該代碼的問題是它只計算x和y以相同速率增加時的條件。當然,我可以改變費率,但這並不能真正解決問題。

我想要做的是計算一個範圍內的條件,比如x(-10,10)和y(-10,10)。我正在考慮使用所有的x值和另一個包含所有y值的數組,然後,我不知道如何計算所有這些值的條件。

我的另一個想法是獲取x的單個值並用所有y值進行測試,然後增加x並一次又一次地測試。

我該如何解決這個問題?

回答

1

方法1:2D「模擬」網格

我在想使所有的x值的數組,另一個與所有y值,但是的話,我不知道該怎麼用所有這些值計算條件。

import numpy as np 

x = np.arange(-10, 10, 0.1) 
y = np.arange(-10, 10, 0.1) 

# Create 2D simulation meshes for x and y. 
# You can read the API entry for meshgrid to learn about options for index 
# ordering, mesh sparsity, and memory copying 
X, Y = np.meshgrid(x, y) 

func1 = X + Y - 1 
func2 = X * Y 
cond = np.logical_and(func1 < func2, func2 < 1.0) # intrinsic `and` does not work here 

# now cond can be used as a 'mask' for any masked-array operations on X and Y 
# including for numpy boolean indexing: 
print('(X, Y) pairs') 
for xy_pair in zip(X[cond], Y[cond]): 
    print xy_pair 

方法2:嵌套循環

我有另一個想法是採取x的一個值,並與所有的y值進行測試,然後再增加x和測試再次。

import numpy as np # no slower or memory-intensive than `from numpy import arange` 

X = [] 
Y = [] 
for y in np.arange(-10, 10, 0.1): 
    for x in np.arange(-10, 10, 0.1): 
     if (x+y-1 < x*y) and (x*y < 1.0): 
      X.append(x) 
      Y.append(y) 

print('(X, Y) pairs') 
for xy_pair in zip(X, Y): 
    print xy_pair 

哪種方法來選擇呢?

我該如何解決這個問題?

這完全取決於你想要做什麼(x, y)對評估爲True。如果你用更多的指導來編輯你的問題,那麼對你的用例來說,更直接的解決方案可能會變得很明顯。

例如,方法1提供二維數組用於繪製解空間而方法2提供緊湊蟒list S代表數據庫福。

警告:有條件的經營者

還必須指出的是,與多個條件運算符的數學表達式沒有意義Python編寫的。這條線:

cond1 = func1 < func2 < 1

如果使用操作的標準順序cond1 = (func1 < func2) < 1將有cond1 = (True/False) < 1中間評價,這將隱含改寫True1False0評估,但不會正確評價數學表達式func1 < func2 < 1

編輯:

@(埃裏克Duminil)的答案爲解決基本的數學問題提供替代的概念,上面假定這兩種方法需要被上離散網格數值求解的問題,並且具有這些離散的解決方案點對於隨後的任何代碼都是必需的

@Uriel的答案可能看起來有效,但請參閱我關於條件運算符的說明,以解釋爲什麼這可能會引起誤解。

此外,我最初鍵入and來組合2D條件語句,但這是不正確的,並導致錯誤。改爲使用np.logical_and

1

對於這類問題,您不想盲目迭代。

首先,你可以尋找明顯的解決方案:x = 0y = 0是一個。

您可以使用sympy來嘗試尋找常規解決方案。 Wolfram Alpha也是這些任務的一個偉大的工具,並發現該地區:

enter image description here

如果這些工具無法找到任何代數解,可以使用scipy.optimize找到一些數值結果:

from scipy.optimize import minimize 
def f(x): 
    return (x[0] + x[1] - 1)**2 + (x[0] * x[1])**2 

minimize(f, [0,0]) 

它輸出:

status: 0 
    success: True 
    njev: 6 
    nfev: 24 
hess_inv: array([[ 0.59518944, -0.40481056], 
     [-0.40481056, 0.59518944]]) 
     fun: 0.050945906253583216 
     x: array([ 0.4533971, 0.4533971]) 
    message: 'Optimization terminated successfully.' 
     jac: array([ -2.88896263e-06, -2.88896263e-06]) 

這個例子有點矯枉過正,但它顯示了大有前途更復雜功能的結果。