【问题标题】:I have a polynomial equation and Y, How can I find X?我有一个多项式方程和 Y,我怎样才能找到 X?
【发布时间】:2022-01-13 08:56:24
【问题描述】:

考虑一下:

X = [1, 2, 3]
p = np.poly1d(X)
print('x: ', X, 'y: ', p(X))

output >> x: [1, 2, 3] y: [ 6 11 18]

如果我想根据y找到x怎么办?

x: [?, ?, ?] y: [ 6 11 18]

【问题讨论】:

  • 听起来像是math.stackexchange.com 的问题——逆多项式(更高的量级)非常困难。编辑:另外,您是否将函数 coeff 定义为 X 然后输入 X?
  • 可能类似于numpy.roots

标签: python python-3.x numpy equation


【解决方案1】:

np.poly1d(X) 表示您创建所需次数的多项式,其中X 是它的系数。我们称它们为 a、b 和 c。所以实际上你有表达

a*x**2 + b*x + c

当您将这三个值传递给 x 时,您会得到以下 3 个等式

a**3 + b*a + c = 6
a*b**2 + b**2 + c = 11
a*c**2 + b*c + c = 18

可能有一种代数方法您可以自己解决它们,但经过快速思考后我没有想出任何东西。但是,sympy 会很乐意为您解决这个方程组。

import numpy as np
import sympy as sym

def generate_y(X):
    return np.poly1d(X)(X)

def solve_x(Y):
    a, b, c = sym.symbols('a b c')
    e1 = sym.Eq(a**3 + b*a + c, Y[0])
    e2 = sym.Eq(a*b**2 + b**2 + c, Y[1])
    e3 = sym.Eq(a*c**2 + b*c + c, Y[2])
    return sym.solvers.solve([e1, e2, e3], [a, b, c])

例如

>>> solve_x(generate_y([1, 2, 3]))
[(1, 2, 3)]
>>> solve_x(generate_y([-5, 105, 2]))
[(-5, 105, 2)]

您可以通过动态创建符号表达式将其推广到 n 阶多项式,但对于更高阶,您会遇到问题(例如生活),而对于一阶,您将有多个解决方案。

def solve_x(Y):
    symbols = sym.symbols('a:z')[:len(Y)]
    X = sym.symbols('X')
    expr = sum(s*X**i for i, s in enumerate(symbols[::-1]))
    eqns = [sym.Eq(expr.subs({X: s}), y) for s, y in zip(symbols, Y)]
    return sym.solvers.solve(eqns, symbols)

用法

>>> solve_x(generate_y([1, 2]))
[(1, 2), (-1 + sqrt(2), 2*sqrt(2)), (-sqrt(2) - 1, -2*sqrt(2))]
>>> solve_x(generate_y([1, 2, 3, 4]))
# still computing...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多