Исключите переменную, чтобы связать две функции в Python, используя SymPy - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть два уравнения, которые параметризованы переменной "t". Они выглядят так:

X = p(t) 
Y = q(t)

где p и q - многочлены от t. Я хочу использовать библиотеку Python SymPy, чтобы исключить переменную t и выразить Y = F (X) для некоторой функции X. Я пытался использовать solve () в SymPy, но это работает не слишком хорошо. Я знаю, что и Maple, и Mathematica имеют функции устранение (), которые могут выполнить это, но я хотел знать, может ли Python иметь общую функцию, которая это делает.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вот слегка проверенная простая процедура

def eliminate(eqs, z):
    """return eqs with parameter z eliminated from each equation; the first
    element in the returned list will be the definition of z that was used
    to eliminate z from the other equations.

    Examples
    ========

    >>> eqs = [Eq(2*x + 3*y + 4*z, 1),
    ...        Eq(9*x + 8*y + 7*z, 2)]
    >>> eliminate(eqs, z)
    [Eq(z, -x/2 - 3*y/4 + 1/4), Eq(11*x/2 + 11*y/4 + 7/4, 2)]
    >>> Eq(y,solve(_[1], y)[0])
    Eq(y, -2*x + 1/11)
    """
    from sympy.solvers.solveset import linsolve
    Z = Dummy()
    rv = []
    for i, e in enumerate(eqs):
        if z not in e.free_symbols:
            continue
        e = e.subs(z, Z)
        if z in e.free_symbols:
            break
        try:
            s = linsolve([e], Z)
            if s:
                zi = list(s)[0][0]
                rv.append(Eq(z, zi))
                rv.extend([eqs[j].subs(z, zi)
                    for j in range(len(eqs)) if j != i])
                return rv
        except ValueError:
            continue
    raise ValueError('only a linear parameter can be eliminated')

Существует более сложная процедура в этой проблеме .

0 голосов
/ 01 ноября 2018

Я ссылаюсь на этот пример из раздела «Область действия» https://reference.wolfram.com/language/ref/Eliminate.html.

Исключить [2 x + 3 года + 4 z == 1 && 9 x + 8 года + 7 z == 2, z]

>>> from sympy import *
>>> var('x y z')
(x, y, z)
>>> solve(2*x+3*y+4*z-1, z)
[-x/2 - 3*y/4 + 1/4]
>>> solve(9*x+8*y+7*z-2, z)
[-9*x/7 - 8*y/7 + 2/7]
>>> (-9*x/7 - 8*y/7 + Rational(2,7))-(-x/2 - 3*y/4 + Rational(1,4)).simplify()
-11*x/14 - 11*y/28 + 1/28
>>> 28*((-9*x/7 - 8*y/7 + Rational(2,7))-(-x/2 - 3*y/4 + Rational(1,4)).simplify())
-22*x - 11*y + 1
  • Решите каждое уравнение для z.
  • Вычтите одно выражение для z из другого.
  • Обратите внимание только на то, что числовые дроби нужно кодировать - я использовал Rational, потому что я забыл другие методы - так что используется дробная арифметика.
  • Я умножаюсь, чтобы избавиться от знаменателей.
  • Этот подход будет работать только для исключения одной переменной. Я не рассмотрел второй и последующие примеры.

Надеюсь, это полезно.

...