Форум сайта python.su
Имеется функция типа: 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))
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)
Офлайн
>>> 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) >>>
Офлайн
py.user.nextСпасибо за отклик! Правда теперь программа выдаёт мне:
Офлайн