forked from KeeeeeK/lab_cheat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalculus_functions.py
138 lines (92 loc) · 4.12 KB
/
calculus_functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
from functools import reduce
from operator import add
from .var import Var, GroupVar
import sympy as sp
import numpy as np
"""
Данный файл отвечает за переопределение базовых операций для выполнения их с бъектами класса var
и перерасчёта погрешностей косвенных измерений
Входящие функции:
'sqrt', 'sin', 'cos', 'tg', 'ctg', 'arctg', 'arcctg', 'arcsin', 'arccos', 'sh', 'ch', 'th', 'cth', 'arcth', 'arcsh',
'exp', 'ln', 'mean'
"""
def _mono_function(x, name_func_for_sympy: str, name_func_for_numpy: str = None,
real_name: str = None):
"""
Эта функция позволяет создать функцию от одной переменной.
Позволяет без головной боли запускать функции от разных типов данных не вызывая проблем
:param x: Аргумент данной функции
:param name_func_for_sympy: Название функции для sympy
:param name_func_for_numpy: Название функции для numpy
:param real_name: Имя функции, удобное для пользователя, должно быть перечислено в списке выше
:return: Результат выполнения данной функции
"""
if name_func_for_numpy is None:
name_func_for_numpy = name_func_for_sympy
if real_name is None:
real_name = name_func_for_sympy
if isinstance(x, GroupVar):
return GroupVar(tuple(_all_funcs[real_name](var) for var in x))
if isinstance(x, Var):
return Var(getattr(sp, name_func_for_sympy)(x._story))
else:
return getattr(np, name_func_for_numpy)(x)
def sqrt(x):
return _mono_function(x, 'sqrt')
def sin(x):
return _mono_function(x, 'sin')
def cos(x):
return _mono_function(x, 'cos')
def tg(x):
return _mono_function(x, 'tan', real_name='tg')
def ctg(x):
if isinstance(x, Var):
return Var(sp.tan(sp.pi / 2 - x._story))
elif isinstance(x, GroupVar):
return _mono_function(x, 'ctg', real_name='ctg')
else:
return np.tan(np.pi / 2 - x)
def arctg(x):
return _mono_function(x, 'atan', name_func_for_numpy='arctan', real_name='arctg')
def arcctg(x):
if isinstance(x, Var):
return Var(sp.pi / 2 - sp.atan(x._story))
elif isinstance(x, GroupVar):
return _mono_function(x, 'ctg', real_name='arcctg')
else:
return np.pi / 2 - np.arctan(x)
def arcsin(x):
return _mono_function(x, 'asin', name_func_for_numpy='arcsin', real_name='arcsin')
def arccos(x):
return _mono_function(x, 'acos', name_func_for_numpy='arccos', real_name='arccos')
def sh(x):
return _mono_function(x, 'sinh', real_name='sh')
def ch(x):
return _mono_function(x, 'cosh', real_name='ch')
def th(x):
return _mono_function(x, 'tanh', real_name='th')
def cth(x):
if isinstance(x, GroupVar):
return _mono_function(x, 'cth', real_name='cth')
return 1 / th(x)
def arcth(x):
return _mono_function(x, 'atanh', name_func_for_numpy='arctanh', real_name='arcth')
def arcsh(x):
return _mono_function(x, 'asinh', name_func_for_numpy='arcsinh', real_name='arcsh')
def arcch(x):
return _mono_function(x, 'acosh', name_func_for_numpy='arccosh', real_name='arcch')
def exp(x):
return _mono_function(x, 'exp')
def ln(x):
return _mono_function(x, 'log', real_name='ln')
def mean(x: GroupVar):
return reduce(add, x)/len(x)
_all_funcs = {'sqrt': sqrt, 'sin': sin, 'cos': cos, 'tg': tg, 'ctg': ctg, 'arctg': arctg, 'arcctg': arcctg,
'arcsin': arcsin, 'arccos': arccos, 'sh': sh, 'ch': ch, 'th': th, 'cth': cth, 'arcth': arcth,
'arcsh': arcch, 'exp': exp, 'ln': ln, 'mean': mean}
def step(x: GroupVar):
"""
Возвращает просто разницу между переменными(x[i]-x[i-1]).
Иногда это лучше чем использовать МНК
"""
return GroupVar(tuple(x[i]-x[i-1] for i in range(1, len(x))))