2016-09-19 74 views
0

我有來自sympy.lambdify幾個功能:求解含有總和非線性系統

f_1 = sym.lambdify((z, m_1, m_2, s_1, s_2), expression_1, modules=['numpy', 'sympy']) 
f_2 = sym.lambdify((z, m_1, m_2, s_1, s_2), expression_2, modules=['numpy', 'sympy']) 
f_3 = sym.lambdify((z, m_1, m_2, s_1, s_2), expression_3, modules=['numpy', 'sympy']) 
f_4 = sym.lambdify((z, m_1, m_2, s_1, s_2), expression_4, modules=['numpy', 'sympy']) 

其中m_1m_2s_1s_2是標量和z是已知的一維陣列(不必是相同的對於每個f_i)。每個f_i的輸出都是標量。

我想(數字)找到m_1m_2s_1s_2使得

sum(f_1(z_i, m_1, m_2, s_1, s_2)) = 0 
sum(f_2(z_i, m_1, m_2, s_1, s_2)) = 0 
sum(f_3(z_i, m_1, m_2, s_1, s_2)) = 0 
sum(f_4(z_i, m_1, m_2, s_1, s_2)) = 0 

總和爲上我。

使用scipy.optimize,我不知道如何實現它(使用fsolve或root)。

回答

0

爲了驅動4個函數F1,F2,F3,F4都爲0, 最小化平方和F1^2 + F2^2 + F3^2 + F4^2: 如果該總和小,每個F也必須很小。 (例如,總和< 0.000001 ⇒每個| F | < 0.001) 使用scipy.optimize.least_squares 做到這一點:

import numpy as np 
from scipy.optimize import least_squares 
    # http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#least-squares-minimization-least-squares 
    # http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html 

# minimize F1**2 + F2**2 + F3**2 + F4**2 -- 
starting_guess = ... 
ret = least_squares([F1, F2, F3, F4], x0=starting_guess, max_nfev=20, verbose=2) 
xmin = ret.x 

(不方在F秒 - least_squares這是否適合你。)

在你的情況,你要移動的總和外lambdify

f1 = sym.lambdify((z, m1, m2, s1, s2) ...)) 
Z1 = numpy array whose rows are all the z_i for f1 

def F1(m1, m2, s1, s2): 
    sum = np.sum([ f(z, m1, m2, s1, s2) for z in Z1 ]) 
    print "F1: %-10.3g at %-10.3g %-10.3g %-10.3g %-10.3g" % (sum, m1, m2, s1, s2) 
    return sum 

# check a few values in ipython -- 
F1(0, 0, 0, 0) 
for x in np.eye(4): 
    F1(*x) 

時的作品,F 2 F3 F4是相似的。檢查他們。然後進行優化:

starting_guess = ... 
ret = least_squares([F1, F2, F3, F4], x0=starting_guess, max_nfev=10, verbose=2) 
xmin = ret.x 

或多個迭代,或使用xtolftol
least_squares有很多選項,請參閱 的full doc

對於任何數量的函數,不僅僅有4個, ,有更奇妙的方法可以處理任意數量的變量:更一般,更隱晦。

(優化進當鋪建議:

  • 開始小
  • 檢查每一個步驟,與打印報表,並以交互的IPython中