У меня есть полиномиальное уравнение и Y, как я могу найти X?

#python #python-3.x #numpy #equation

#python #python-3.x #numpy #уравнение

Вопрос:

Рассмотрим это:

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

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

что, если я хочу найти x на основе y ?

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

Комментарии:

1. Звучит как вопрос для math.stackexchange.com — обратные полиномы (более высоких величин) чрезвычайно сложны. РЕДАКТИРОВАТЬ: кроме того, вы определяете свою функцию coeff как X, а затем вводите X?

2. Может быть, что-то вроде numpy.roots

Ответ №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-го порядка, динамически создавая символьные выражения, но для более высокого порядка вы столкнетесь с проблемами (такова жизнь), а для 1-го порядка у вас будет несколько решений.

 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...