【问题标题】:Solving non linear system containing a sum求解包含和的非线性系统
【发布时间】:2016-09-19 19:55:50
【问题描述】:

我有几个来自 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

i 上的总和。

使用scipy.optimize,不知道怎么实现(使用fsolve或者root)。

【问题讨论】:

    标签: python optimization scipy


    【解决方案1】:

    要将F1、F2、F3、F4这4个函数全部驱动为0, 最小化平方和 F1^2 + F2^2 + F3^2 + F4^2: 如果总和很小,则每个 F 也必须很小。 (例如, sum 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 )
    

    当它起作用时,F2 F3 F4 是相似的。也检查一下。然后优化:

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

    或更多迭代,或使用xtol ftol
    least_squares 有很多选项,请参阅 full doc

    对于任意数量的功能,有更好的方法来执行上述操作,而不仅仅是 4 个, 任意数量的变量:更一般,更模糊。

    (优化建议:

    • 从小处着手
    • 检查每一步,使用打印语句,并在 ipython 中交互。

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 2013-11-14
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多