使用Python解决超越方程组问题

3

假设我有以下四个方程:

  1. cos(x)/x = a
  2. cos(y)/y = b
  3. a + b = 1
  4. c sinc(x) = d sinc(y)

其中未知变量为x、y、ab。请注意,cos(x)/x=a有多个解,变量y同样如此。我只对xy的值感兴趣,这些值是第一个正根(如果有必要)。

您可以安全地假设a、b、cd是已知的实数常数,全部为正数。

在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中做类似的事情。因此,如果有人能够指导我(或者简单地向我展示如何解决这个问题),我将非常感激。


可能是 用Python解决非线性方程组 的重复问题。 - Prune
1个回答

4
你可以使用 root
import numpy as np
from scipy.optimize import root

def your_funcs(X):

    x, y, a, b = X

    f = [np.cos(x) / x - 0.2 * a - 0.1,
         np.cos(y) / y - 0.2 * 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])
print(sol2.x)

将会打印

[ 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)。

另外,你也可以使用fsolve

from scipy.optimize import fsolve

sol3 = fsolve(your_funcs, [0.1, 0.1, 0.3, 0.1])

这将为您提供相同的结果:

[ 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)

这将为您提供“旧”的输出结果:

[ 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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接