用python求解超越方程组

编程入门 行业动态 更新时间:2024-10-10 15:20:26
本文介绍了用python求解超越方程组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

假设我有以下四个等式:

Assuming I have the following four equations:

  • 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 值感兴趣,它们是第一个正根(如果重要的话).

    for unknown variables x, y, a and b. Note that cos(x)/x=a has multiple solutions. Similar goes for variable y. I am only interested in x and y values, which are first positive roots (if that matters).

    您可以安全地假设 a, b, c 和 d 是已知的实常数,都是正的.

    You can safely assume a, b, c and d are known real constants, all positive.

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

    In Mathematica the code to solve this would look something like:

    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 中做这样的事情.因此,如果有人能指导我(或简单地告诉我如何)解决这个问题,我将不胜感激.

    While this was quite easy, I have no idea how to do anything like that in python. So if somebody could kinda guide me (or simply show me how) to solve this, I would highly appreciate it.

    推荐答案

    您可以使用 root:

    You can use 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.

    Your functions have to be defined in a way that they evaluate to 0, e.g. a + b - 1 instead of a + b = 1.

    快速检查:

    print(your_funcs(sol2.x))

    给予

    [-1.9356960478944529e-11, 1.8931356482454476e-11, 0.0, -4.1039033282785908e-11]

    所以,解应该没问题(请注意e-11基本为0).

    So, the solution should be ok (please note that e-11 is basically 0).

    或者,您也可以使用 fsolve:

    Alternatively, you can also use 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 参数传递其他参数:

    You can pass additional arguments using the args argument:

    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]

    更多推荐

    用python求解超越方程组

    本文发布于:2023-11-30 06:12:49,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1648985.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:方程组   python

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!