求解python中的联立方程

时间:2016-07-28 12:32:28

标签: python python-3.x numpy

我有以下测试程序。我的查询是两个折叠的:(1)一些解决方案如何给出零和(2)在变量上使用这种x2= np.where(x > y, 1, x)条件是否合适? Scipy中是否有任何约束优化程序?

a = 13.235
b = 70.678

def system(X, a,b):
    x=X[0]
    y=X[1]

    x2= np.where(x > y, 1, x)    

    f=np.zeros(3)
    f[0] = 2*x2 - y - a
    f[1] = 3*x2 + 2*y- b


    return (X)


func=  lambda X: system(X, a, b)

guess=[5,5]
sol =  optimize.root(func,guess)
print(sol)

编辑:(2a)这里有x2= np.where(x > y, 1, x)条件,两个方程式成为一个方程式。 (2b)另一个变化要求是:x2= np.where(x > y, x^2, x^3)。我也要对这两点发表评论。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您的system功能是一种身份,因为您return X而不是return f。返回应该与X的形状相同,所以你最好有

f = np.array([2*x2 - y - a, 3*x2 + 2*y- b])

接下来,所写的函数具有不连续性,其中x = y,这导致(5,5)的初始猜测存在问题。将初始猜测设置为(5,6)可以快速找到解决方案[13.87828571,14.52157143]。

对于第二个例子,再次使用[5,5]的初始猜测导致不连续性问题,使用[5,6]给出了[2.40313743,14.52157143]的解决方案。

这是我的代码:

import numpy as np
from scipy import optimize

def system(X, a=13.235, b=70.678):
    x = np.where(X[0] > X[1], X[0]**2, X[0]**3)
    y=X[1]    
    return np.array( [2*x - y - a, 3*x + 2*y - b])

guess = [5,6]
sol = optimize.root(system, guess)
print(sol)