用python求解超越方程组

用python求解超越方程组,python,scipy,numeric,equation-solving,transcendental-equation,Python,Scipy,Numeric,Equation Solving,Transcendental Equation,假设我有以下四个等式: cos(x)/x=a cos(y)/y=b a+b=1 c sinc(x)=d sinc(y) 对于未知变量x、y、a和b。请注意,cos(x)/x=a有多种解决方案。变量y也是如此。我只对x和y值感兴趣,它们是第一个正根(如果这很重要的话) 您可以安全地假设a、b、c和d是已知的实常数,均为正值 在Mathematica中,解决此问题的代码如下所示: FindRoot[{Cos[x]/x == 0.2 a + 0.1, Cos[y]/y == 0.

假设我有以下四个等式:

  • cos(x)/x=a
  • cos(y)/y=b
  • a+b=1
  • c sinc(x)=d sinc(y)
  • 对于未知变量
    x、y、a
    b
    。请注意,
    cos(x)/x=a
    有多种解决方案。变量
    y
    也是如此。我只对
    x
    y
    值感兴趣,它们是第一个正根(如果这很重要的话)

    您可以安全地假设
    a、b、c
    d
    是已知的实常数,均为正值

    在Mathematica中,解决此问题的代码如下所示:

    FindRoot[{Cos[x]/x == 0.2 a + 0.1, 
              Cos[y]/y == 0.2 b + 0.1, 
              a + b == 1.0, 
               1.03*Sinc[x] == Sinc[y]*1.02}, 
              {{x, .1}, {y, .1}, {a, .3}, {b, .1}}]
    
    其结果是返回

    {x -> 1.31636, y -> 1.29664, a -> 0.456034, b -> 0.543966}
    
    虽然这很容易,但我不知道如何在python中执行类似的操作。因此,如果有人能指导我(或简单地告诉我如何)解决这个问题,我将不胜感激。

    您可以使用:

    那会打印出来的

    [ 1.30301572  1.30987969  0.51530547  0.48469453]
    
    您的函数必须以计算为0的方式定义,例如
    a+b-1
    而不是
    a+b=1

    快速检查:

    print(your_funcs(sol2.x))
    
    给予

    [-1.9356960478944529e-11, 1.8931356482454476e-11, 0.0, -4.1039033282785908e-11]
    
    因此,解决方案应该是可以的(请注意
    e-11
    基本上是0)

    或者,您也可以使用:

    这会给你同样的结果:

    [ 1.30301572  1.30987969  0.51530547  0.48469453]
    
    您可以使用
    args
    参数传递其他参数:

    def your_funcs(X, fac_a, fac_b):
    
        x, y, a, b = X
    
        f = [np.cos(x) / x - fac_a * a - 0.1,
             np.cos(y) / y - fac_b * b - 0.1,
             a + b - 1,
             1.03 * np.sinc(x) - 1.02 * np.sinc(y)]
    
        return f
    
    sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1], args=(0.2, 0.2))
    print(sol2.x)
    
    这将为您提供“旧”输出:

    如果你跑

    sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1], args=(0.4, 0.2))
    print(sol2.x)
    
    然后您会收到:

    [ 1.26670224  1.27158794  0.34096159  0.65903841]
    
    可能重复的
    [ 1.30301572  1.30987969  0.51530547  0.48469453]
    
    sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1], args=(0.4, 0.2))
    print(sol2.x)
    
    [ 1.26670224  1.27158794  0.34096159  0.65903841]