Как нарисовать общее уравнение с помощью matplotlib? - PullRequest
2 голосов
/ 11 июля 2020

Была исследована следующая проблема - в основном с matplotlib в python.

Возможны функции «Basi c», например y = x^2, но если я хочу построить уравнение (которое не обязательно является функцией из-за нескольких ассоциаций xy), например:

x^2 + y^2 = 1 (просто базовый c круг с радиусом 1 вокруг точки (0/0) в двухмерном

Есть ли способ построить такое уравнение с помощью matplotlib или другой подобной библиотеки?

Мне пришла в голову идея переписать уравнение в функцию с возможностью рисования, но из-за присвоения абсолютного значения оно выглядит сложнее, чем исходное уравнение, например, приведенное выше уравнение превращается в «функцию»: |y| = sqrt(1-x²) с -y и +y.

// РЕДАКТИРОВАТЬ: по запросу от @ mkrieger1 редактирование этого вопроса. Цель моего программного обеспечения - использовать ввод (заданный другой функцией; строка, представляющая любое уравнение, например, "y^3-sqrt(sin(x^2)-2)*2 = 3x") и превратить его в график. Мне лично не удалось решить функции для y (как упоминалось ранее), особенно с более сложными функциями. Разделение этих уравнений на «более мелкие части», учитывая широкий спектр математических входных данных, также довольно сложно, поэтому я подумал, что лучше всего будет использовать метод решения контуров. (Как предложил @ mkrieger1). Еще раз, этот подход имеет решающее значение из-за необходимого «редактирования» уравнения перед его реализацией в plt.contour(X, Y, func, [0]), а также из-за предупреждения пользователя позже.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Вы также можете использовать sympy в преобразовать выражение в строке в уравнение, а затем построить его. Я пропустил -2 примера, так как это приведет к совершенно пустому графику. Синтаксический анализатор Sympy поддерживает специальные функции, позволяющие опустить умножение (как в 3x) и преобразовывать функцию xor Python (^) в степень.

from sympy import plot_implicit, Eq
from sympy.parsing.sympy_parser import parse_expr
from sympy.parsing.sympy_parser import standard_transformations, convert_xor, implicit_multiplication

string = "y^3-sqrt(sin(x^2))*2 = 3x"
transformations = (standard_transformations + (implicit_multiplication,) + (convert_xor,))
lhs = parse_expr(string.split('=')[0], transformations=transformations)
rhs = parse_expr(string.split('=')[1], transformations=transformations)

plot_implicit(Eq(lhs, rhs))

sample plot

Another example:

from sympy import plot_implicit, Eq, cos
from sympy.abc import x, y

plot_implicit(Eq(x/y, cos(y)), (x, -10, 10), (y, -10, 10))

Обратите внимание, что без явной установки диапазона для переменных plot_implicit предполагает диапазоны по умолчанию от -5 до 5.

другой пример

0 голосов
/ 11 июля 2020

Если вы вообще используете matplotlib, вы заметите, что plot принимает пару массивов равной длины, представляющих последовательности пар xy. Он ничего не знает о функциях, уравнениях или каких-либо других концепциях, которые вы упоминаете. При этом стандартный подход к преобразованию чего-то, что не является функцией в декартовом пространстве, например круга, заключается в его параметризации. Одним из возможных способов параметризации для многих популярных нефункций является использование полярных координат.

Например:

t = np.linspace(0, 2 * np.pi, 100)   # the parameter
x = np.cos(t)
y = np.sin(t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...