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