Разбор Symboli c Уравнения для функций Sympy - PullRequest
4 голосов
/ 27 февраля 2020

Я пытаюсь передать image1 в своем коде, когда я копирую и вставляю это как текст, это выглядит так ∑(i=1,n)(a+m*x*(i)-y*(i))^2.

, но это не работает.

ниже приведен мой код, который работает с другим синтаксисом:

from sympy import symbols,sympify,solve,Eq,Symbol

from sympy import symbols,Eq,sympify,summation
expr = **('summation((m * x*(i) + a - y*(i))^2, (i, 0, n))')**
Eq1 = Eq(sympify(expr))
print(Eq1)
values = {2001,10,2,3,5}
arr_symbols = list(Eq1.free_symbols)
print(arr_symbols)
Method1(arr_symbols,values,expr)

def Method1(arr_symbols,Values,expr):
    from sympy import symbols, Eq, solve, pprint, integrate, sympify
    z = symbols('z')
    Formula = Eq(sympify(expr),z)
    print(Formula)
    index = 0
    for i in Values:
        Formula = Formula.subs(arr_symbols[index],i)
        index+=1
    print(solve(Formula))

, но я хочу использовать ∑(i=1,n)(a+m*x*(i)-y*(i))^2 и попросить sympy преобразовать его для меня.

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

SymPy может представлять это уравнение, но оно может анализировать только Python. Вы могли бы написать расширения для его анализатора для обработки такого рода вещей (см. https://docs.sympy.org/latest/modules/parsing.html). Это должно быть возможно в принципе, хотя это может быть не так просто. Я бы только рекомендовал делать это, синтаксис ваших выражений уже очень близок к Python. Если это не так (и похоже, что это не так), было бы лучше для настоящей библиотеки синтаксического анализа, такой как ANTLR, создать грамматику для ваших выражений. Затем вы можете использовать это для анализа в SymPy (см., Например, как написан модуль sympy.parsing.latex).

Я не знаю, есть ли уже существующая библиотека в Python, которая обрабатывает ваши типы выражений. Я не знаю ни о чем. В лучшем случае вы сможете найти грамматику, которую кто-то уже написал, поэтому вам не нужно писать ее самостоятельно.

0 голосов
/ 12 марта 2020

это невозможно сделать. мы должны передать латексный код.

0 голосов
/ 27 февраля 2020

Если вы, учитывая a, m и значения для x и y и пытаетесь вычислить сумму квадратов остатков, было бы лучше написать функцию, которая выполняет что-то или сделать что-то вроде этого:

>>> x = [1, 2, 3]
>>> y = [4, 7, 11]
>>> a = 2
>>> m = 5
>>> sum((a + m*xi - yi)**2 for xi, yi in zip(x, y))
70
...