Уведомления

Группа в Telegram: @pythonsu

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

Mitay4ik
Зарегистрирован: 2018-10-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение в 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

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9971
Репутация: +  856  -
Профиль   Отправить e-mail  

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

  
>>> type(x)
<class 'sympy.core.symbol.Symbol'>
>>>
>>> x
x
>>> 
>>> np.sign(x + 1)
Traceback (most recent call last):
  File "<stdin>", 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 "<stdin>", 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
>>>

  
>>> sympy.sign(x + 1)
sign(x + 1)
>>>


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



Офлайн

#3 Окт. 28, 2018 22:07:18

Mitay4ik
Зарегистрирован: 2018-10-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next
Спасибо за отклик! Правда теперь программа выдаёт мне:

UserWarning: Adaptive meshing could not be applied to the expression. Using uniform meshing.
warnings.warn(“Adaptive meshing could not be applied to the”)

Пока не придумал, что делать с этим.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version