Неявное задание функции python

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Построение в Python сложной неявной функции с условиями numpy.sign

#1 Окт. 26, 2018 11:34:25

Построение в Python сложной неявной функции с условиями numpy.sign

Имеется функция типа: F24(x)+k*F23(y) = a Результатом её построения должна быть кусочно-линейная функция (ломаная линия). F24 и F23 содержат в себе функции sign (см. фото). С помощью модуля sympy и plot_implicit справиться с построением функции не удалось.

import numpy as np from sympy import var, plot_implicit, Eq beta1 = 0.04 beta2 = 0.3 ksi1 = 0.15 ksi2 = 1.2 ksi3 = 2.5 alfa = 0.4 h = 0.15 k = 2.5 def F23(x, b11, b12, b21, b22): return (((x - b11)/2) * (np.sign(x - b11) + 1)) + (((x + b21)/2) * (1 - np.sign(x + b21))) - (((x - b12)/2) * (np.sign(x - b12) + 1)) - (((x + b22)/2) * (1 - np.sign(x + b22))) def F24(x, b11, b12, b13, b21, b22, b23): return F23(x, b11, b12, b21, b22) - ((b12 - b11)/2 * (np.sign(x - b13) + 1)) - ((b22 - b21)/2 * (np.sign(x + b23) - 1)) var('x y') plot_implicit(Eq(F24(x, ksi1, ksi2, ksi3, ksi1, ksi2, ksi3)+k*F23(y, beta1, beta2, beta1, beta2), alfa)) 

Видимо, implicit совсем не воспринимает sign.

D:\Python\python.exe D:/PyProjects/Lamer.py Traceback (most recent call last): File "D:/PyProjects/Lamer.py", line 22, in module> plot_implicit(Eq(F24(x, ksi1, ksi2, ksi3, ksi1, ksi2, ksi3)+k*F23(y, beta1, beta2, beta1, beta2), alfa)) File "D:/PyProjects/Lamer.py", line 18, in F24 return F23(x, b11, b12, b21, b22) - ((b12 - b11)/2 * (np.sign(x - b13) + 1)) - ((b22 - b21)/2 * (np.sign(x + b23) - 1)) File "D:/PyProjects/Lamer.py", line 14, in F23 return (((x - b11)/2) * (np.sign(x - b11) + 1)) + (((x + b21)/2) * (1 - np.sign(x + b21))) - (((x - b12)/2) * (np.sign(x - b12) + 1)) - (((x + b22)/2) * (1 - np.sign(x + b22))) File "D:\Python\lib\site-packages\sympy\core\relational.py", line 229, in __nonzero__ raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational Process finished with exit code 1 

Отредактировано Mitay4ik (Окт. 26, 2018 12:12:55)

#2 Окт. 26, 2018 13:10:13

Построение в Python сложной неявной функции с условиями numpy.sign

>>> type(x) class 'sympy.core.symbol.Symbol'> >>> >>> x x >>> >>> np.sign(x + 1) Traceback (most recent call last): File "", line 1, in module> File "/usr/lib/python3.6/site-packages/sympy/core/relational.py", line 195, in __nonzero__ raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational >>> >>> np.sign(x) Traceback (most recent call last): File "", line 1, in module> File "/usr/lib/python3.6/site-packages/sympy/core/relational.py", line 195, in __nonzero__ raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational >>> 
>>> #import numpy as np . >>> import sympy >>> from sympy import var, plot_implicit, Eq >>> >>> beta1 = 0.04 >>> beta2 = 0.3 >>> ksi1 = 0.15 >>> ksi2 = 1.2 >>> ksi3 = 2.5 >>> alfa = 0.4 >>> h = 0.15 >>> k = 2.5 >>> >>> def F23(x, b11, b12, b21, b22): . return ( . (((x - b11) / 2) * (sympy.sign(x - b11) + 1)) . + (((x + b21) / 2) * (1 - sympy.sign(x + b21))) . - (((x - b12) / 2) * (sympy.sign(x - b12) + 1)) . - (((x + b22) / 2) * (1 - sympy.sign(x + b22))) . ) . >>> def F24(x, b11, b12, b13, b21, b22, b23): . return ( . F23(x, b11, b12, b21, b22) . - ((b12 - b11) / 2 * (sympy.sign(x - b13) + 1)) . - ((b22 - b21) / 2 * (sympy.sign(x + b23) - 1)) . ) . >>> var('x y') (x, y) >>> >>> # plot_implicit( . # Eq(F24(x, ksi1, ksi2, ksi3, ksi1, ksi2, ksi3) . # + k * F23(y, beta1, beta2, beta1, beta2), . # alfa)) . Eq(F24(x, ksi1, ksi2, ksi3, ksi1, ksi2, ksi3) . + k * F23(y, beta1, beta2, beta1, beta2), . alfa) Eq(-(x/2 - 0.6)*(sign(x - 1.2) + 1) + (x/2 - 0.075)*(sign(x - 0.15) + 1) + (x/2 + 0.075)*(-sign(x + 0.15) + 1) - (x/2 + 0.6)*(-sign(x + 1.2) + 1) - 2.5*(y/2 - 0.15)*(sign(y - 0.3) + 1) + 2.5*(y/2 - 0.02)*(sign(y - 0.04) + 1) + 2.5*(y/2 + 0.02)*(-sign(y + 0.04) + 1) - 2.5*(y/2 + 0.15)*(-sign(y + 0.3) + 1) - 0.525*sign(x - 2.5) - 0.525*sign(x + 2.5), 0.400000000000000) >>> 

Источник

Блог

python — Построение неявной функции f (x, y) = 0, где x, y подвергаются матричному умножению

#python #function #matplotlib #plot #implicit

#python #функция #matplotlib #построение #неявный

Вопрос:

В качестве неявной функции, где ‘A’ является матрицей n * 2

Возможно ли с помощью matplotlib или других средств отобразить все строки на одном графике без большого цикла?

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

1. 0 = np.dot((x,y),A) недопустимый код Python. Не могли бы вы прояснить свою проблему?

Ответ №1:

Учитывая n*2 матрицу A , для каждой строки i строка определяется A[i,0]*x A[i,1]*y == 0 . Это означает, что 0,0 всегда лежит на прямой, так же как и точка x=A[i,1],y=-A[i,0] . Умножение на любое значение, например, путем нормализации, снова даст точки на линии.

Следующий код показывает 3 способа визуализации этих строк:

  • Некоторые отрезки линии, вырезанные окружностью, вместе с x=A[i,1],y=-A[i,0] и x=-A[i,1],y=A[i,0] .
  • Те же сегменты простирались до границы графика.
  • Просто некоторые конечные точки на окружности.
 import matplotlib.pyplot as plt import numpy as np from numpy.linalg import norm from matplotlib.collections import LineCollection n = 10 radius = 20 A = np.random.uniform(-10, 10, (n, 2)) B = A / norm(A, axis=1, keepdims=True) * radius # normalize and put on a circle with given radius lines = np.dstack([B[:, 1], -B[:, 0], -B[:, 1], B[:, 0]]).reshape(-1, 2, 2) fig, axes = plt.subplots(ncols=3, figsize=(14, 4)) for ax in axes: ax.set_aspect('equal') for ax in axes[:2]: lc = LineCollection(lines, colors='blue', linewidths=2) ax.add_collection(lc) if ax == axes[0]: ax.scatter(A[:, 1], -A[:, 0], color='crimson') ax.scatter(-A[:, 1], A[:, 0], color='crimson') elif ax == axes[1]: ax.set_xlim(-radius / 2, radius / 2) ax.set_ylim(-radius / 2, radius / 2) for k in range(2): axes[2].scatter(lines[:, k, 0], lines[:, k, 1], color='crimson') axes[0].set_title('lines in circle and dots') axes[1].set_title('lines till border') axes[2].set_title('dots on circle') plt.show() 

Источник

Можно ли построить неявные уравнения с помощью Matplotlib?

Я хотел бы построить неявные уравнения (вида f(x, y)=g (x, y), например. X^y=y^x) в Matplotlib. Возможно ли это?

7 ответов

Я не верю, что для этого есть очень хорошая поддержка, но вы можете попробовать что-то вроде

import matplotlib.pyplot from numpy import arange from numpy import meshgrid delta = 0.025 xrange = arange(-5.0, 20.0, delta) yrange = arange(-5.0, 20.0, delta) X, Y = meshgrid(xrange,yrange) # F is one side of the equation, G is the other F = Y**X G = X**Y matplotlib.pyplot.contour(X, Y, (F - G), [0]) matplotlib.pyplot.show() 

посмотреть API docs на contour : если четвертый аргумент является последовательностью, он указывает, какие контурные линии следует построить. Но сюжет будет так же хорош, как разрешение ваших диапазонов, и есть определенные функции, которые он может никогда не получить правильно, часто в точках пересечения.

поскольку вы пометили этот вопрос с симпатией, я приведу такой пример.

from sympy import var, plot_implicit var('x y') plot_implicit(x*y**3 - y*x**3) 

matplotlib не строит уравнения; он строит серии точек. Вы можете использовать такой инструмент, как scipy​.optimize численно вычислить точки y из значений x (или наоборот) неявных уравнений численно или любое количество других инструментов по мере необходимости.

например, вот пример, где я строю неявное уравнение x ** 2 + x * y + y ** 2 = 10 в определенной области.

from functools import partial import numpy import scipy.optimize import matplotlib.pyplot as pp def z(x, y): return x ** 2 + x * y + y ** 2 - 10 x_window = 0, 5 y_window = 0, 5 xs = [] ys = [] for x in numpy.linspace(*x_window, num=200): try: # A more efficient technique would use the last-found-y-value as a # starting point y = scipy.optimize.brentq(partial(z, x), *y_window) except ValueError: # Should we not be able to find a solution in this window. pass else: xs.append(x) ys.append(y) pp.plot(xs, ys) pp.xlim(*x_window) pp.ylim(*y_window) pp.show() 

существует неявное уравнение (и неравенство) плоттера в sympy. Он создается как часть GSoC и создает графики как экземпляры фигур matplotlib.

начиная с версии sympy 0.7.2-это:

>>> from sympy.plotting import plot_implicit >>> p = plot_implicit(x < sin(x)) # also creates a window with the plot >>> the_matplotlib_axes_instance = p._backend._ax 

Если вы хотите использовать что-то другое, кроме matplotlib (но все же python), есть sage:

большое спасибо Стив, Майк, Алекс. Я согласился с решением Стива (см. код ниже). Моя единственная оставшаяся проблема заключается в том, что контурный график появляется за моими линиями сетки, в отличие от обычного графика, который я могу заставить спереди с помощью zorder. Еще один халп очень признателен.

import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator, FormatStrFormatter import numpy as np fig = plt.figure(1) ax = fig.add_subplot(111) # set up axis ax.spines['left'].set_position('zero') ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') # setup x and y ranges and precision x = np.arange(-0.5,5.5,0.01) y = np.arange(-0.5,5.5,0.01) # draw a curve line, = ax.plot(x, x**2,zorder=100) # draw a contour X,Y=np.meshgrid(x,y) F=X**Y G=Y**X ax.contour(X,Y,(F-G),[0],zorder=100) #set bounds ax.set_xbound(-1,7) ax.set_ybound(-1,7) #produce gridlines of different colors/widths ax.xaxis.set_minor_locator(MultipleLocator(0.2)) ax.yaxis.set_minor_locator(MultipleLocator(0.2)) ax.xaxis.grid(True,'minor',linestyle='-') ax.yaxis.grid(True,'minor',linestyle='-') minor_grid_lines = [tick.gridline for tick in ax.xaxis.get_minor_ticks()] for idx,loc in enumerate(ax.xaxis.get_minorticklocs()): if loc % 2.0 == 0: minor_grid_lines[idx].set_color('0.3') minor_grid_lines[idx].set_linewidth(2) elif loc % 1.0 == 0: minor_grid_lines[idx].set_c('0.5') minor_grid_lines[idx].set_linewidth(1) else: minor_grid_lines[idx].set_c('0.7') minor_grid_lines[idx].set_linewidth(1) minor_grid_lines = [tick.gridline for tick in ax.yaxis.get_minor_ticks()] for idx,loc in enumerate(ax.yaxis.get_minorticklocs()): if loc % 2.0 == 0: minor_grid_lines[idx].set_color('0.3') minor_grid_lines[idx].set_linewidth(2) elif loc % 1.0 == 0: minor_grid_lines[idx].set_c('0.5') minor_grid_lines[idx].set_linewidth(1) else: minor_grid_lines[idx].set_c('0.7') minor_grid_lines[idx].set_linewidth(1) plt.show() 

Источник

Функции и их аргументы

Python 3 логотип

В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.

Именные функции, инструкция def

Функция в python — объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def.

Определим простейшую функцию:

Инструкция return говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y.

Теперь мы ее можем вызвать:

 
  Функция может и не заканчиваться инструкцией return, при этом функция вернет значение None:

Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.

Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:

    Как видно из примера, args - это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.

Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **:

В переменной kwargs у нас хранится словарь, с которым мы, опять-таки, можем делать все, что нам заблагорассудится.

Анонимные функции, инструкция lambda

Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():

 

Для вставки кода на Python в комментарий заключайте его в теги

  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов

Источник

Читайте также:  Tolocalestring to date javascript
Оцените статью