CalculusCalculator 1.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- calculuscalculator-1.4.0/CalculusCalculator/__init__.py +0 -0
- calculuscalculator-1.4.0/CalculusCalculator/derivative.py +33 -0
- calculuscalculator-1.4.0/CalculusCalculator/functions.py +94 -0
- calculuscalculator-1.4.0/CalculusCalculator/integral.py +17 -0
- calculuscalculator-1.4.0/CalculusCalculator/main.py +406 -0
- calculuscalculator-1.4.0/CalculusCalculator/resources.py +132013 -0
- calculuscalculator-1.4.0/CalculusCalculator/run.py +11 -0
- calculuscalculator-1.4.0/CalculusCalculator/simplification.py +44 -0
- calculuscalculator-1.4.0/CalculusCalculator/solvers.py +46 -0
- calculuscalculator-1.4.0/CalculusCalculator/sympify.py +18 -0
- calculuscalculator-1.4.0/CalculusCalculator/ui.py +674 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/PKG-INFO +65 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/SOURCES.txt +19 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/dependency_links.txt +1 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/entry_points.txt +2 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/requires.txt +2 -0
- calculuscalculator-1.4.0/CalculusCalculator.egg-info/top_level.txt +1 -0
- calculuscalculator-1.4.0/PKG-INFO +65 -0
- calculuscalculator-1.4.0/README.md +53 -0
- calculuscalculator-1.4.0/pyproject.toml +27 -0
- calculuscalculator-1.4.0/setup.cfg +4 -0
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from sympy import diff, idiff, solve, Eq
|
|
2
|
+
from CalculusCalculator.sympify import sympify
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def derivative(f, v, n, x, fs):
|
|
6
|
+
# 该函数用于计算显函数的导函数并返回Latex表达式
|
|
7
|
+
# f(str):原函数(显函数)表达式
|
|
8
|
+
# v(str):自变量表达式
|
|
9
|
+
# n(str):求导次数
|
|
10
|
+
# x(str):自变量的值
|
|
11
|
+
# fs(dict):函数列表
|
|
12
|
+
# return:返回导函数表达式
|
|
13
|
+
|
|
14
|
+
if x is None:
|
|
15
|
+
return diff(sympify(f, fs), sympify(v, fs), int(n))
|
|
16
|
+
else:
|
|
17
|
+
return diff(sympify(f, fs), sympify(v, fs), int(n)).subs(sympify(v, fs), sympify(x, fs))
|
|
18
|
+
|
|
19
|
+
def yinhanshu_derivative(f, v1, v2, n, x, fs):
|
|
20
|
+
# 该函数用于计算隐函数的导函数并返回Latex表达式
|
|
21
|
+
# f(str):原函数(隐函数)表达式(值等于0)
|
|
22
|
+
# v1(str):自变量表达式
|
|
23
|
+
# v2(str):因变量表达式
|
|
24
|
+
# n(str):求导次数
|
|
25
|
+
# x(str):自变量的值
|
|
26
|
+
# fs(dict):函数列表
|
|
27
|
+
# return:返回导函数表达式
|
|
28
|
+
|
|
29
|
+
if x is None:
|
|
30
|
+
return idiff(sympify(f, fs), sympify(v2, fs), sympify(v1, fs), int(n))
|
|
31
|
+
else:
|
|
32
|
+
return idiff(sympify(f, fs), sympify(v2, fs), sympify(v1, fs), int(n)).subs(sympify(v1, fs), sympify(x, fs)).subs(sympify(v2, fs), \
|
|
33
|
+
solve(Eq(sympify(f, fs).subs(sympify(v1, fs), sympify(x, fs)), 0), sympify(v2, fs))[0])
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from sympy import diff, solveset, Rel, symbols, maximum, minimum, Interval, Intersection, oo, imageset, Lambda, periodicity
|
|
2
|
+
from sympy.calculus.util import function_range
|
|
3
|
+
from CalculusCalculator.sympify import sympify
|
|
4
|
+
|
|
5
|
+
def frange(f, s, d, is_increase, fs):
|
|
6
|
+
# 求出给定函数的值域
|
|
7
|
+
# f(str):函数表达式
|
|
8
|
+
# s(str):自变量符号
|
|
9
|
+
# d(str):定义域
|
|
10
|
+
# fs(dict):函数列表
|
|
11
|
+
# return:函数值域
|
|
12
|
+
|
|
13
|
+
return function_range(sympify(f, fs), symbols(s), domain = sympify(d, fs))
|
|
14
|
+
|
|
15
|
+
def monotonic_interval(f, s, d, is_increase, fs):
|
|
16
|
+
# 求出给定函数的单调区间
|
|
17
|
+
# f(str):函数表达式
|
|
18
|
+
# s(str):自变量符号
|
|
19
|
+
# d(str):定义域
|
|
20
|
+
# is_increase(bool):是否求单调递增区间,否则为单调递减区间
|
|
21
|
+
# fs(dict):函数列表
|
|
22
|
+
# return:函数单调递增区间或单调递减区间
|
|
23
|
+
|
|
24
|
+
return solveset(Rel(diff(sympify(f, fs)), 0, ">"), symbols(s), domain = sympify(d, fs)) if is_increase \
|
|
25
|
+
else solveset(Rel(diff(sympify(f, fs)), 0, "<"), symbols(s), domain = sympify(d, fs))
|
|
26
|
+
|
|
27
|
+
def odd_or_even(f, s, d, arg, fs):
|
|
28
|
+
# 求出给定函数的奇偶性
|
|
29
|
+
# f(str):函数表达式
|
|
30
|
+
# s(str):自变量符号
|
|
31
|
+
# d(str):定义域
|
|
32
|
+
# arg(None):占位参数
|
|
33
|
+
# fs(dict):函数列表
|
|
34
|
+
# return:函数奇偶性
|
|
35
|
+
|
|
36
|
+
if Intersection(Interval.open(-oo,0),sympify(d, fs)).symmetric_difference( \
|
|
37
|
+
imageset(Lambda(sympify(s, fs),-sympify(s, fs)), Intersection(Interval.open(0,oo),sympify(d, fs)))).is_empty: # 判断定义域是否关于0对称
|
|
38
|
+
if sympify(f, fs).equals(0): # 判断f(x) = 0
|
|
39
|
+
return "既奇又偶函数"
|
|
40
|
+
elif sympify(f, fs).equals(-(sympify(f, fs).subs(symbols(s), -symbols(s)))): # 判断f(x) = -f(-x)
|
|
41
|
+
return "奇函数"
|
|
42
|
+
elif sympify(f, fs).equals(sympify(f, fs).subs(symbols(s), -symbols(s))): # 判断f(x) = f(-x)
|
|
43
|
+
return "偶函数"
|
|
44
|
+
else:
|
|
45
|
+
return "非奇非偶函数"
|
|
46
|
+
else:
|
|
47
|
+
return "非奇非偶函数"
|
|
48
|
+
|
|
49
|
+
def period(f, s, d, arg, fs):
|
|
50
|
+
# 求出给定函数的周期
|
|
51
|
+
# f(str):函数表达式
|
|
52
|
+
# s(str):自变量符号
|
|
53
|
+
# d(str):定义域
|
|
54
|
+
# arg(None):占位参数
|
|
55
|
+
# fs(dict):函数列表
|
|
56
|
+
# return:函数周期
|
|
57
|
+
|
|
58
|
+
p = periodicity(sympify(f, fs), symbols(s))
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
if sympify(d, fs).sup == oo:
|
|
62
|
+
return p if p is not None else "该函数无周期"
|
|
63
|
+
elif sympify(d, fs).sup != oo and sympify(d, fs) == -oo:
|
|
64
|
+
return -p if p is not None else "该函数无周期"
|
|
65
|
+
else:
|
|
66
|
+
return "该函数无周期"
|
|
67
|
+
except:
|
|
68
|
+
return "该函数无周期"
|
|
69
|
+
|
|
70
|
+
def mvalues(f, s, d, is_max, fs):
|
|
71
|
+
# 求出给定函数的最值
|
|
72
|
+
# f(str):函数表达式
|
|
73
|
+
# s(str):自变量符号
|
|
74
|
+
# d(str):定义域
|
|
75
|
+
# is_max(bool):是否求最大值,否则为最小值
|
|
76
|
+
# fs(dict):函数列表
|
|
77
|
+
# return:函数最大值或最小值
|
|
78
|
+
|
|
79
|
+
return maximum(sympify(f, fs), symbols(s), domain = sympify(d, fs)) if is_max \
|
|
80
|
+
else minimum(sympify(f, fs), symbols(s), domain = sympify(d, fs))
|
|
81
|
+
|
|
82
|
+
def get_function_attr(f, s, d, attr, fs):
|
|
83
|
+
# 调用上述函数
|
|
84
|
+
# f(str):函数表达式
|
|
85
|
+
# s(str):自变量符号
|
|
86
|
+
# d(str):定义域
|
|
87
|
+
# attr(int):表示要求的函数属性种类
|
|
88
|
+
# fs(dict):函数列表
|
|
89
|
+
# return:返回函数属性
|
|
90
|
+
|
|
91
|
+
attrs = [[frange, None], [monotonic_interval, True], [monotonic_interval, False], [odd_or_even, None], \
|
|
92
|
+
[period, None], [mvalues, True], [mvalues, False]]
|
|
93
|
+
|
|
94
|
+
return attrs[attr - 1][0](f, s, d, attrs[attr - 1][1], fs) if attr != 0 else (sympify(f, fs), sympify(d, fs))
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from sympy import integrate
|
|
2
|
+
from CalculusCalculator.sympify import sympify
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def integral(f, v, fs, a = None, b = None):
|
|
6
|
+
# 该函数用于计算被积函数的积分并返回表达式
|
|
7
|
+
# f(str):被积函数表达式
|
|
8
|
+
# v(str):积分变量表达式
|
|
9
|
+
# fs(dict):函数列表
|
|
10
|
+
# a(str):定积分下限
|
|
11
|
+
# b(str):定积分上限
|
|
12
|
+
# return:返回导函数表达式
|
|
13
|
+
|
|
14
|
+
if a is None and b is None:
|
|
15
|
+
return integrate(sympify(f, fs), sympify(v, fs))
|
|
16
|
+
else:
|
|
17
|
+
return integrate(sympify(f, fs), (sympify(v, fs), sympify(a, fs), sympify(b, fs)))
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
from CalculusCalculator.ui import Ui_MainWindow
|
|
2
|
+
|
|
3
|
+
import CalculusCalculator.resources
|
|
4
|
+
from CalculusCalculator.derivative import derivative, yinhanshu_derivative
|
|
5
|
+
from CalculusCalculator.integral import integral
|
|
6
|
+
from CalculusCalculator.simplification import simplifies
|
|
7
|
+
from CalculusCalculator.solvers import solve_fangcheng, solve_weifenfangcheng, solve_fangchengzu, solve_budengshi, solve_budengshizu
|
|
8
|
+
from CalculusCalculator.functions import get_function_attr
|
|
9
|
+
|
|
10
|
+
from sympy import latex, Eq, Rel, symbols, Symbol
|
|
11
|
+
from CalculusCalculator.sympify import sympify
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
from PySide6.QtWidgets import QMainWindow, QVBoxLayout, QHBoxLayout, QSplitter, QWidget, QGroupBox, QStackedWidget
|
|
15
|
+
from PySide6.QtWebEngineWidgets import QWebEngineView
|
|
16
|
+
from PySide6.QtCore import QRect, QUrl
|
|
17
|
+
|
|
18
|
+
class MainWindow(QMainWindow):
|
|
19
|
+
def __init__(self, parent=None):
|
|
20
|
+
|
|
21
|
+
super().__init__(parent)
|
|
22
|
+
self.ui = Ui_MainWindow()
|
|
23
|
+
self.ui.setupUi(self)
|
|
24
|
+
self.ps = [self.ui.tabWidget.widget(i).objectName() for i in range(self.ui.tabWidget.count())]
|
|
25
|
+
self.ws = {p.objectName():[[w.parent().objectName(), w.objectName(), str(w.parent().geometry())[15::], str(w.geometry())[15::]] for w in self.ui.tabWidget.findChild(QWidget, p.objectName()).findChildren(QWebEngineView)] \
|
|
26
|
+
for p in self.ui.tabWidget.findChild(QStackedWidget).children()}
|
|
27
|
+
self.fs, self.eqs, self.rels = {}, {}, {}
|
|
28
|
+
|
|
29
|
+
self.setup()
|
|
30
|
+
|
|
31
|
+
def setup(self):
|
|
32
|
+
|
|
33
|
+
self.ui.tabWidget.currentChanged.connect(self.updateWebEngineView)
|
|
34
|
+
|
|
35
|
+
self.ui.dingyi_hanshuliebiao.itemClicked.connect(self.read_function)
|
|
36
|
+
self.ui.dingyi_baocun.clicked.connect(self.save_function)
|
|
37
|
+
self.ui.dingyi_shanchu.clicked.connect(self.delete_function)
|
|
38
|
+
self.ui.dingyi_hanshushuxing.addItems(["表达式&定义域", "值域", "单调递增区间", "单调递减区间", "奇偶性", "周期", "最大值", "最小值"])
|
|
39
|
+
self.ui.dingyi_hanshushuxing.setCurrentIndex(0)
|
|
40
|
+
self.ui.dingyi_hanshushuxing.currentIndexChanged.connect(self.update_function_attr)
|
|
41
|
+
self.ui.dingyi_zibianliangzhi.textChanged.connect(self.function_value)
|
|
42
|
+
|
|
43
|
+
self.ui.qiudao_input.textChanged.connect(self.setqiudao_yuanhanshu)
|
|
44
|
+
self.ui.qiudao_qiudao_button.clicked.connect(self.qiudao_button_f)
|
|
45
|
+
self.ui.qiudao_yinhanshu.stateChanged.connect(self.qiudao_yinhanshu_f)
|
|
46
|
+
self.ui.qiudao_qiuchujutizhi.stateChanged.connect(self.qiudao_jutizhi_f)
|
|
47
|
+
|
|
48
|
+
self.ui.jifen_input.textChanged.connect(self.setjifen_beijihanshu)
|
|
49
|
+
self.ui.jifen_jifen_button.clicked.connect(self.jifen_button_f)
|
|
50
|
+
self.ui.jifen_dingjifen.stateChanged.connect(self.jifen_dingjifen_f)
|
|
51
|
+
|
|
52
|
+
self.ui.bianxing_bianxingfangfa.addItems(["通用化简(simplify)", "展开(expand)", "因式分解(factor)", "主元(collect)", "通分(cancel)", "分离(apart)"])
|
|
53
|
+
self.ui.bianxing_bianxingfangfa.addItems(["三角变换(trigsimp)", "三角展开(expand_trig)", "指数合并(powsimp)", "指数展开(expand_power_exp)"])
|
|
54
|
+
self.ui.bianxing_bianxingfangfa.addItems(["对数展开(expand_log)", "对数合并(logcombine)", "换元"])
|
|
55
|
+
self.ui.bianxing_bianxingfangfa.currentIndexChanged.connect(self.bianxing_bianxingfangfa_f)
|
|
56
|
+
self.ui.bianxing_input.textChanged.connect(self.setbianxing_yuanshi)
|
|
57
|
+
self.ui.bianxing_bianxing_button.clicked.connect(self.bianxing_button_f)
|
|
58
|
+
|
|
59
|
+
self.ui.fangcheng_zuoshi.textChanged.connect(self.setfangcheng_yuanfangcheng)
|
|
60
|
+
self.ui.fangcheng_youshi.textChanged.connect(self.setfangcheng_yuanfangcheng)
|
|
61
|
+
self.ui.fangcheng_quzhifanwei.textChanged.connect(self.setfangcheng_yuanfangcheng)
|
|
62
|
+
self.ui.fangcheng_weifenfangcheng.stateChanged.connect(self.fangcheng_weifenfangcheng_f)
|
|
63
|
+
self.ui.fangcheng_qiujie.clicked.connect(self.fangcheng_button_f)
|
|
64
|
+
|
|
65
|
+
self.ui.fangchengzu_baocun.clicked.connect(self.save_fangcheng)
|
|
66
|
+
self.ui.fangchengzu_shanchu.clicked.connect(self.delete_fangcheng)
|
|
67
|
+
self.ui.fangchengzu_fangcheng.itemClicked.connect(self.read_fangcheng)
|
|
68
|
+
self.ui.fangchengzu_qiujie.clicked.connect(self.fangchengzu_button_f)
|
|
69
|
+
|
|
70
|
+
self.ui.budengshi_budenghao.addItems(["!=", ">", ">=", "<", "<="])
|
|
71
|
+
self.ui.budengshi_budenghao.currentIndexChanged.connect(self.setbudengshi_yuanshi)
|
|
72
|
+
self.ui.budengshi_zuoshi.textChanged.connect(self.setbudengshi_yuanshi)
|
|
73
|
+
self.ui.budengshi_youshi.textChanged.connect(self.setbudengshi_yuanshi)
|
|
74
|
+
self.ui.budengshi_quzhifanwei.textChanged.connect(self.setbudengshi_yuanshi)
|
|
75
|
+
self.ui.budengshi_qiujie.clicked.connect(self.budengshi_button_f)
|
|
76
|
+
|
|
77
|
+
self.ui.budengshizu_budenghao.addItems(["!=", ">", ">=", "<", "<="])
|
|
78
|
+
self.ui.budengshizu_baocun.clicked.connect(self.save_budengshi)
|
|
79
|
+
self.ui.budengshizu_shanchu.clicked.connect(self.delete_budengshi)
|
|
80
|
+
self.ui.budengshizu_budengshi.itemClicked.connect(self.read_budengshi)
|
|
81
|
+
self.ui.budengshizu_qiujie.clicked.connect(self.budengshizu_button_f)
|
|
82
|
+
|
|
83
|
+
layout = QVBoxLayout(self.ui.centralwidget)
|
|
84
|
+
layout.setContentsMargins(0, 0, 0, 0)
|
|
85
|
+
layout.addWidget(self.ui.tabWidget)
|
|
86
|
+
|
|
87
|
+
homepage = QVBoxLayout(self.ui.shouye)
|
|
88
|
+
homepage.setContentsMargins(0, 0, 0, 0)
|
|
89
|
+
homepage.addWidget(self.ui.shouye_welcome)
|
|
90
|
+
|
|
91
|
+
self.help_path = QUrl("qrc:///help.html")
|
|
92
|
+
self.ui.webEngineView.setUrl(self.help_path)
|
|
93
|
+
|
|
94
|
+
self.updateWebEngineView("shouye")
|
|
95
|
+
|
|
96
|
+
def setWebEngineView(self, n, l, w):
|
|
97
|
+
# 显示表达式
|
|
98
|
+
# n:函数名
|
|
99
|
+
# l:要显示的Latex表达式
|
|
100
|
+
# w:要设置的WebEngineView
|
|
101
|
+
|
|
102
|
+
base_url = QUrl.fromLocalFile(os.path.dirname(__file__) + '/')
|
|
103
|
+
html = r'<html><head><script src="qrc:///MathJax/es5/tex-svg.js"></script></head><body><div><p style="font-size:34px">\({}{}\)</p></div></body></html>'.format(n, l)
|
|
104
|
+
w.setHtml(html, base_url)
|
|
105
|
+
|
|
106
|
+
def updateWebEngineView(self, arg):
|
|
107
|
+
# 切换页面时创建当前页面渲染框,销毁其他页面渲染框
|
|
108
|
+
p = self.ui.tabWidget.currentWidget().objectName()
|
|
109
|
+
for w in self.ws[p]:
|
|
110
|
+
exec("self.ui.{} = QWebEngineView(self.ui.{})".format(w[1], w[0]))
|
|
111
|
+
exec("self.ui.{}.setObjectName(u'{}')".format(w[1], w[1]))
|
|
112
|
+
exec("self.ui.{}.setGeometry({})".format(w[1], w[3]))
|
|
113
|
+
exec("self.ui.{}.show()".format(w[1]))
|
|
114
|
+
try:
|
|
115
|
+
exec("self.set{}()".format(w[1]))
|
|
116
|
+
except:
|
|
117
|
+
pass
|
|
118
|
+
if w[1] == "webEngineView":
|
|
119
|
+
exec("self.ui.webEngineView.setUrl(self.help_path)")
|
|
120
|
+
for other_p in self.ps:
|
|
121
|
+
if other_p != p:
|
|
122
|
+
for w in self.ws[other_p]:
|
|
123
|
+
try:
|
|
124
|
+
self.ui.tabWidget.findChild(QStackedWidget).findChild(QWidget, other_p).findChild(QWebEngineView, w[1]).deleteLater()
|
|
125
|
+
except:
|
|
126
|
+
pass
|
|
127
|
+
|
|
128
|
+
def read_function(self, item):
|
|
129
|
+
# 读取函数信息,显示在文本框中
|
|
130
|
+
fn = item.text().split('(')[0]
|
|
131
|
+
if fn != '':
|
|
132
|
+
self.ui.dingyi_mingcheng.setText(self.fs[fn][0])
|
|
133
|
+
self.ui.dingyi_biaodashi.setText(self.fs[fn][1])
|
|
134
|
+
self.ui.dingyi_dingyiyu.setText(self.fs[fn][2])
|
|
135
|
+
self.ui.dingyi_zibianliang.setText(self.fs[fn][3])
|
|
136
|
+
self.ui.dingyi_hanshushuxing.setCurrentIndex(0)
|
|
137
|
+
self.update_function_attr(0)
|
|
138
|
+
self.function_value()
|
|
139
|
+
|
|
140
|
+
def setdingyi_hanshushuxing_view(self):
|
|
141
|
+
# 切换至定义页面渲染公式
|
|
142
|
+
self.read_function(self.ui.dingyi_hanshuliebiao.currentItem())
|
|
143
|
+
|
|
144
|
+
def save_function(self):
|
|
145
|
+
# 保存函数信息,显示在列表中
|
|
146
|
+
if self.ui.dingyi_mingcheng.text() not in self.fs.keys():
|
|
147
|
+
self.ui.dingyi_hanshuliebiao.insertItem(0, "{}({})".format(self.ui.dingyi_mingcheng.text(), self.ui.dingyi_zibianliang.text()))
|
|
148
|
+
self.ui.dingyi_hanshuliebiao.setCurrentRow(0)
|
|
149
|
+
self.fs[self.ui.dingyi_mingcheng.text()] = [self.ui.dingyi_mingcheng.text(), self.ui.dingyi_biaodashi.text(), self.ui.dingyi_dingyiyu.text(), self.ui.dingyi_zibianliang.text()]
|
|
150
|
+
self.ui.dingyi_hanshushuxing.setCurrentIndex(0)
|
|
151
|
+
self.update_function_attr(0)
|
|
152
|
+
self.function_value()
|
|
153
|
+
|
|
154
|
+
def delete_function(self):
|
|
155
|
+
# 删除相应的函数
|
|
156
|
+
f = self.ui.dingyi_hanshuliebiao.takeItem(self.ui.dingyi_hanshuliebiao.currentRow())
|
|
157
|
+
del f
|
|
158
|
+
del self.fs[self.ui.dingyi_mingcheng.text()]
|
|
159
|
+
if self.fs != {}:
|
|
160
|
+
self.read_function(self.ui.dingyi_hanshuliebiao.currentItem())
|
|
161
|
+
self.update_function_attr(0)
|
|
162
|
+
self.function_value()
|
|
163
|
+
|
|
164
|
+
def update_function_attr(self, attr):
|
|
165
|
+
# 获取函数属性并显示
|
|
166
|
+
function_attr = get_function_attr(self.ui.dingyi_biaodashi.text(), self.ui.dingyi_zibianliang.text(), self.ui.dingyi_dingyiyu.text(), attr, self.fs)
|
|
167
|
+
self.ui.dingyi_hanshushuxing_lineedit.setText(str(function_attr))
|
|
168
|
+
try:
|
|
169
|
+
self.setWebEngineView('' if self.ui.dingyi_hanshushuxing.currentIndex() != 0 else self.ui.dingyi_hanshuliebiao.currentItem().text() + "=", \
|
|
170
|
+
latex(function_attr) if self.ui.dingyi_hanshushuxing.currentIndex() != 0 else latex(function_attr[0]) + '({}\\in {})'.format(self.ui.dingyi_zibianliang.text(), latex(function_attr[1])), \
|
|
171
|
+
self.ui.dingyi_hanshushuxing_view)
|
|
172
|
+
except:
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
def function_value(self):
|
|
176
|
+
# 根据给定自变量值求出函数值
|
|
177
|
+
f_value = sympify(self.ui.dingyi_biaodashi.text(), self.fs).subs(symbols(self.ui.dingyi_zibianliang.text()), sympify(self.ui.dingyi_zibianliangzhi.text(), self.fs))
|
|
178
|
+
self.ui.dingyi_qiuzhi_lineedit.setText(str(f_value))
|
|
179
|
+
try:
|
|
180
|
+
self.setWebEngineView("{}({})=".format(self.ui.dingyi_mingcheng.text(), latex(sympify(self.ui.dingyi_zibianliangzhi.text(), self.fs))), latex(f_value), self.ui.dingyi_qiuzhi)
|
|
181
|
+
except:
|
|
182
|
+
pass
|
|
183
|
+
|
|
184
|
+
def setqiudao_yuanhanshu(self):
|
|
185
|
+
# 加载原函数
|
|
186
|
+
try:
|
|
187
|
+
self.setWebEngineView('f(x)=', latex(sympify(self.ui.qiudao_input.text(), self.fs)), self.ui.qiudao_yuanhanshu)
|
|
188
|
+
except:
|
|
189
|
+
pass
|
|
190
|
+
|
|
191
|
+
def qiudao_yinhanshu_f(self):
|
|
192
|
+
# 更改求解模式:是否隐函数
|
|
193
|
+
self.is_yinhanshu = self.ui.qiudao_yinhanshu.isChecked()
|
|
194
|
+
self.ui.qiudao_yinbianliang.setEnabled(self.ui.qiudao_yinhanshu.isChecked())
|
|
195
|
+
|
|
196
|
+
def qiudao_jutizhi_f(self):
|
|
197
|
+
# 更改求解模式:是否具体值
|
|
198
|
+
self.is_jutizhi = self.ui.qiudao_qiuchujutizhi.isChecked()
|
|
199
|
+
self.ui.qiudao_zibianliangzhi.setEnabled(self.ui.qiudao_qiuchujutizhi.isChecked())
|
|
200
|
+
|
|
201
|
+
def qiudao_button_f(self):
|
|
202
|
+
# 求导
|
|
203
|
+
self.is_yinhanshu = self.ui.qiudao_yinhanshu.isChecked()
|
|
204
|
+
self.is_jutizhi = self.ui.qiudao_qiuchujutizhi.isChecked()
|
|
205
|
+
if self.is_yinhanshu:
|
|
206
|
+
if self.is_jutizhi:
|
|
207
|
+
dif = yinhanshu_derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_yinbianliang.text(), self.ui.qiudao_qiudaocishu.text(), None, self.fs)
|
|
208
|
+
self.setWebEngineView("f'(x)=", latex(dif), self.ui.qiudao_daohanshu)
|
|
209
|
+
self.ui.qiudao_daohanshu_lineedit.setText(str(dif))
|
|
210
|
+
dif = yinhanshu_derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_yinbianliang.text(), self.ui.qiudao_qiudaocishu.text(), self.ui.qiudao_zibianliangzhi.text(), self.fs)
|
|
211
|
+
self.setWebEngineView("f'({})=".format(self.ui.qiudao_zibianliangzhi.text()), latex(dif), self.ui.qiudao_daoshuzhi)
|
|
212
|
+
self.ui.qiudao_daoshuzhi_lineedit.setText(str(dif))
|
|
213
|
+
else:
|
|
214
|
+
dif = yinhanshu_derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_yinbianliang.text(), self.ui.qiudao_qiudaocishu.text(), None, self.fs)
|
|
215
|
+
self.setWebEngineView("f'(x)=", latex(dif), self.ui.qiudao_daohanshu)
|
|
216
|
+
self.ui.qiudao_daohanshu_lineedit.setText(str(dif))
|
|
217
|
+
else:
|
|
218
|
+
if self.is_jutizhi:
|
|
219
|
+
dif = derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_qiudaocishu.text(), None, self.fs)
|
|
220
|
+
self.setWebEngineView("f'(x)=", latex(dif), self.ui.qiudao_daohanshu)
|
|
221
|
+
self.ui.qiudao_daohanshu_lineedit.setText(str(dif))
|
|
222
|
+
dif = derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_qiudaocishu.text(), self.ui.qiudao_zibianliangzhi.text(), self.fs)
|
|
223
|
+
self.setWebEngineView("f'({})=".format(self.ui.qiudao_zibianliangzhi.text()), latex(dif), self.ui.qiudao_daoshuzhi)
|
|
224
|
+
self.ui.qiudao_daoshuzhi_lineedit.setText(str(dif))
|
|
225
|
+
else:
|
|
226
|
+
dif = derivative(self.ui.qiudao_input.text(), self.ui.qiudao_zibianliang.text(), self.ui.qiudao_qiudaocishu.text(), None, self.fs)
|
|
227
|
+
self.setWebEngineView("f'(x)=", latex(dif), self.ui.qiudao_daohanshu)
|
|
228
|
+
self.ui.qiudao_daohanshu_lineedit.setText(str(dif))
|
|
229
|
+
|
|
230
|
+
def setjifen_beijihanshu(self):
|
|
231
|
+
# 加载原函数
|
|
232
|
+
try:
|
|
233
|
+
self.setWebEngineView('f(x)=', latex(sympify(self.ui.jifen_input.text(), self.fs)), self.ui.jifen_beijihanshu)
|
|
234
|
+
except:
|
|
235
|
+
pass
|
|
236
|
+
|
|
237
|
+
def jifen_dingjifen_f(self):
|
|
238
|
+
# 更改求解模式:是否定积分
|
|
239
|
+
self.is_dingjifen = self.ui.jifen_dingjifen.isChecked()
|
|
240
|
+
self.ui.jifen_shangxianzhi.setEnabled(self.ui.jifen_dingjifen.isChecked())
|
|
241
|
+
self.ui.jifen_xiaxianzhi.setEnabled(self.ui.jifen_dingjifen.isChecked())
|
|
242
|
+
|
|
243
|
+
def jifen_button_f(self):
|
|
244
|
+
# 积分
|
|
245
|
+
self.is_dingjifen = self.ui.jifen_dingjifen.isChecked()
|
|
246
|
+
if self.is_dingjifen:
|
|
247
|
+
F = integral(self.ui.jifen_input.text(), self.ui.jifen_jifenbianliang.text(), self.fs)
|
|
248
|
+
self.setWebEngineView('F(x)=', latex(F), self.ui.jifen_yuanhanshu)
|
|
249
|
+
self.ui.jifen_yuanhanshu_lineedit.setText(str(F))
|
|
250
|
+
F = integral(self.ui.jifen_input.text(), self.ui.jifen_jifenbianliang.text(), self.ui.jifen_xiaxianzhi.text(), self.ui.jifen_shangxianzhi.text(), self.fs)
|
|
251
|
+
self.setWebEngineView('F(x)=', latex(F), self.ui.jifen_dingjifenzhi)
|
|
252
|
+
self.ui.jifen_dingjifenzhi_lineedit.setText(str(F))
|
|
253
|
+
|
|
254
|
+
else:
|
|
255
|
+
self.ui.jifen_dingjifenzhi.setHtml("")
|
|
256
|
+
F = integral(self.ui.jifen_input.text(), self.ui.jifen_jifenbianliang.text(), self.fs)
|
|
257
|
+
self.setWebEngineView('F(x)=', latex(F), self.ui.jifen_yuanhanshu)
|
|
258
|
+
self.ui.jifen_yuanhanshu_lineedit.setText(str(F))
|
|
259
|
+
|
|
260
|
+
def setbianxing_yuanshi(self):
|
|
261
|
+
# 加载原式
|
|
262
|
+
try:
|
|
263
|
+
self.setWebEngineView('', latex(sympify(self.ui.bianxing_input.text(), self.fs)), self.ui.bianxing_yuanshi)
|
|
264
|
+
except:
|
|
265
|
+
pass
|
|
266
|
+
|
|
267
|
+
def bianxing_bianxingfangfa_f(self):
|
|
268
|
+
# 识别变形方法并更改文本框状态
|
|
269
|
+
if self.ui.bianxing_bianxingfangfa.currentIndex() == 3:
|
|
270
|
+
self.ui.bianxing_zhuyuanfuhao.setEnabled(True)
|
|
271
|
+
self.ui.bianxing_huanyuanfuhao.setEnabled(False)
|
|
272
|
+
self.ui.bianxing_huanyuanshi.setEnabled(False)
|
|
273
|
+
elif self.ui.bianxing_bianxingfangfa.currentIndex() == 12:
|
|
274
|
+
self.ui.bianxing_zhuyuanfuhao.setEnabled(True)
|
|
275
|
+
self.ui.bianxing_huanyuanfuhao.setEnabled(True)
|
|
276
|
+
self.ui.bianxing_huanyuanshi.setEnabled(True)
|
|
277
|
+
else:
|
|
278
|
+
self.ui.bianxing_zhuyuanfuhao.setEnabled(False)
|
|
279
|
+
self.ui.bianxing_huanyuanfuhao.setEnabled(False)
|
|
280
|
+
self.ui.bianxing_huanyuanshi.setEnabled(False)
|
|
281
|
+
|
|
282
|
+
def bianxing_button_f(self):
|
|
283
|
+
# 变形
|
|
284
|
+
self.bianxingfangfa = self.ui.bianxing_bianxingfangfa.currentIndex()
|
|
285
|
+
self.bianxingshi = simplifies(self.ui.bianxing_input.text(), self.bianxingfangfa, self.ui.bianxing_zhuyuanfuhao.text() if self.ui.bianxing_zhuyuanfuhao.isEnabled() else None, \
|
|
286
|
+
self.ui.bianxing_huanyuanfuhao.text() if self.ui.bianxing_huanyuanfuhao.isEnabled() else None, self.ui.bianxing_huanyuanshi.text() if self.ui.bianxing_huanyuanshi.isEnabled() else None, self.fs)
|
|
287
|
+
self.setWebEngineView('', latex(self.bianxingshi), self.ui.bianxing_bianxingshi)
|
|
288
|
+
self.ui.bianxing_bianxingshi_lineedit.setText(str(self.bianxingshi))
|
|
289
|
+
|
|
290
|
+
def setfangcheng_yuanfangcheng(self):
|
|
291
|
+
# 加载原方程
|
|
292
|
+
self.eq_fangcheng = Eq(sympify(self.ui.fangcheng_zuoshi.text(), self.fs if not self.ui.fangcheng_weifenfangcheng.isChecked() else {}), \
|
|
293
|
+
sympify(self.ui.fangcheng_youshi.text(), self.fs if not self.ui.fangcheng_weifenfangcheng.isChecked() else {}))
|
|
294
|
+
self.setWebEngineView('','{} (x\\in {})'.format(latex(self.eq_fangcheng), latex(sympify(self.ui.fangcheng_quzhifanwei.text(), self.fs))) if not self.ui.fangcheng_weifenfangcheng.isChecked() \
|
|
295
|
+
else latex(self.eq_fangcheng), self.ui.fangcheng_yuanfangcheng)
|
|
296
|
+
|
|
297
|
+
def fangcheng_weifenfangcheng_f(self):
|
|
298
|
+
# 更改求解模式:是否微分方程
|
|
299
|
+
self.ui.fangcheng_zhuyuanfuhao.setText("f(x)" if self.ui.fangcheng_weifenfangcheng.isChecked() else "x")
|
|
300
|
+
self.ui.fangcheng_zhuyuanfuhao.setEnabled(not self.ui.fangcheng_weifenfangcheng.isChecked())
|
|
301
|
+
self.ui.fangcheng_quzhifanwei.setText("" if self.ui.fangcheng_weifenfangcheng.isChecked() else "Reals")
|
|
302
|
+
self.ui.fangcheng_quzhifanwei.setEnabled(not self.ui.fangcheng_weifenfangcheng.isChecked())
|
|
303
|
+
|
|
304
|
+
def fangcheng_button_f(self):
|
|
305
|
+
# 求解方程
|
|
306
|
+
if self.ui.fangcheng_weifenfangcheng.isChecked():
|
|
307
|
+
self.jieji_fangcheng = solve_weifenfangcheng(self.eq_fangcheng, self.ui.fangcheng_zhuyuanfuhao.text(), self.fs)
|
|
308
|
+
self.setWebEngineView('', latex(self.jieji_fangcheng), self.ui.fangcheng_jieji)
|
|
309
|
+
self.ui.fangcheng_jieji_lineedit.setText(str(self.jieji_fangcheng))
|
|
310
|
+
else:
|
|
311
|
+
self.jieji_fangcheng = solve_fangcheng(self.eq_fangcheng, self.ui.fangcheng_zhuyuanfuhao.text(), self.ui.fangcheng_quzhifanwei.text(), self.fs)
|
|
312
|
+
self.setWebEngineView('', latex(self.jieji_fangcheng), self.ui.fangcheng_jieji)
|
|
313
|
+
self.ui.fangcheng_jieji_lineedit.setText(str(self.jieji_fangcheng))
|
|
314
|
+
|
|
315
|
+
def read_fangcheng(self, item):
|
|
316
|
+
# 读取方程并显示
|
|
317
|
+
self.setWebEngineView('', latex(self.eqs[item.text()]), self.ui.fangchengzu_yuanfangcheng)
|
|
318
|
+
self.ui.fangchengzu_zuoshi.setText(str(self.eqs[item.text()].lhs))
|
|
319
|
+
self.ui.fangchengzu_youshi.setText(str(self.eqs[item.text()].rhs))
|
|
320
|
+
|
|
321
|
+
def setfangchengzu_yuanfangcheng(self):
|
|
322
|
+
# 切换至当前选项卡时加载不等式
|
|
323
|
+
if self.ui.fangchengzu_fangcheng.count() != 0:
|
|
324
|
+
self.read_fangcheng(self.ui.fangchengzu_fangcheng.currentItem())
|
|
325
|
+
|
|
326
|
+
def save_fangcheng(self):
|
|
327
|
+
# 保存方程
|
|
328
|
+
if Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs)) not in self.eqs.values():
|
|
329
|
+
self.eqs[str(Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs)))] = Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs))
|
|
330
|
+
self.ui.fangchengzu_fangcheng.addItem(str(Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs))))
|
|
331
|
+
self.ui.fangchengzu_fangcheng.setCurrentRow(self.ui.fangchengzu_fangcheng.count() - 1)
|
|
332
|
+
else:
|
|
333
|
+
self.eqs[str(Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs)))] = Eq(sympify(self.ui.fangchengzu_zuoshi.text(), self.fs), sympify(self.ui.fangchengzu_youshi.text(), self.fs))
|
|
334
|
+
self.read_fangcheng(self.ui.fangchengzu_fangcheng.currentItem())
|
|
335
|
+
|
|
336
|
+
def delete_fangcheng(self):
|
|
337
|
+
# 删除方程
|
|
338
|
+
fangcheng = self.ui.fangchengzu_fangcheng.takeItem(self.ui.fangchengzu_fangcheng.currentRow())
|
|
339
|
+
del self.eqs[fangcheng.text()]
|
|
340
|
+
del fangcheng
|
|
341
|
+
if self.eqs != {}:
|
|
342
|
+
self.read_fangcheng(self.ui.fangchengzu_fangcheng.currentItem())
|
|
343
|
+
|
|
344
|
+
def fangchengzu_button_f(self):
|
|
345
|
+
# 求解方程组
|
|
346
|
+
try:
|
|
347
|
+
result = solve_fangchengzu(list(self.eqs.values()), [Symbol(s) for s in self.ui.fangchengzu_ziyoubianliang.text().split(',')], self.fs)
|
|
348
|
+
except:
|
|
349
|
+
result = "无解"
|
|
350
|
+
self.setWebEngineView('', latex(result).replace(':', "="), self.ui.fangchengzu_jieji)
|
|
351
|
+
self.ui.fangchengzu_jieji_lineedit.setText(result)
|
|
352
|
+
|
|
353
|
+
def setbudengshi_yuanshi(self):
|
|
354
|
+
# 加载原不等式
|
|
355
|
+
try:
|
|
356
|
+
self.rel_budengshi = Rel(sympify(self.ui.budengshi_zuoshi.text(), self.fs), sympify(self.ui.budengshi_youshi.text(), self.fs), self.ui.budengshi_budenghao.currentText())
|
|
357
|
+
self.setWebEngineView('', '{}\\quad (x\\in {})'.format(latex(self.rel_budengshi), latex(sympify(self.ui.budengshi_quzhifanwei.text(), self.fs))), self.ui.budengshi_yuanshi)
|
|
358
|
+
except:
|
|
359
|
+
pass
|
|
360
|
+
|
|
361
|
+
def budengshi_button_f(self):
|
|
362
|
+
# 求解不等式
|
|
363
|
+
self.jieji_budengshi = solve_budengshi(self.rel_budengshi, self.ui.budengshi_zhuyuanfuhao.text(), self.ui.budengshi_quzhifanwei.text(), self.fs)
|
|
364
|
+
self.setWebEngineView('', latex(self.jieji_budengshi), self.ui.budengshi_jieji)
|
|
365
|
+
self.ui.budengshi_jieji_lineedit.setText(str(self.jieji_budengshi))
|
|
366
|
+
|
|
367
|
+
def read_budengshi(self, item):
|
|
368
|
+
# 读取不等式并显示
|
|
369
|
+
self.setWebEngineView('', latex(self.rels[item.text()]), self.ui.budengshizu_yuanbudengshi)
|
|
370
|
+
self.ui.budengshizu_zuoshi.setText(str(self.rels[item.text()].lhs))
|
|
371
|
+
self.ui.budengshizu_youshi.setText(str(self.rels[item.text()].rhs))
|
|
372
|
+
|
|
373
|
+
def setbudengshizu_yuanbudengshi(self):
|
|
374
|
+
# 切换至当前选项卡时加载不等式
|
|
375
|
+
if self.ui.budengshizu_budengshi.count() != 0:
|
|
376
|
+
self.read_budengshi(self.ui.budengshizu_budengshi.currentItem())
|
|
377
|
+
|
|
378
|
+
def save_budengshi(self):
|
|
379
|
+
# 保存不等式
|
|
380
|
+
if Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText()) not in self.rels.values():
|
|
381
|
+
self.rels[str(Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText()))] = \
|
|
382
|
+
Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText())
|
|
383
|
+
self.ui.budengshizu_budengshi.addItem(str(Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText())))
|
|
384
|
+
self.ui.budengshizu_budengshi.setCurrentRow(self.ui.budengshizu_budengshi.count() - 1)
|
|
385
|
+
else:
|
|
386
|
+
self.rels[str(Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText()))] = \
|
|
387
|
+
Rel(sympify(self.ui.budengshizu_zuoshi.text(), self.fs), sympify(self.ui.budengshizu_youshi.text(), self.fs), self.ui.budengshizu_budenghao.currentText())
|
|
388
|
+
self.read_budengshi(self.ui.budengshizu_budengshi.currentItem())
|
|
389
|
+
|
|
390
|
+
def delete_budengshi(self):
|
|
391
|
+
# 删除不等式
|
|
392
|
+
budengshi = self.ui.budengshizu_budengshi.takeItem(self.ui.budengshizu_budengshi.currentRow())
|
|
393
|
+
del self.rels[budengshi.text()]
|
|
394
|
+
del budengshi
|
|
395
|
+
if self.rels != {}:
|
|
396
|
+
self.read_budengshi(self.ui.budengshizu_budengshi.currentItem())
|
|
397
|
+
|
|
398
|
+
def budengshizu_button_f(self):
|
|
399
|
+
# 求解不等式组
|
|
400
|
+
try:
|
|
401
|
+
result = solve_budengshizu(list(self.rels.values()), Symbol(self.ui.budengshizu_ziyoubianliang.text()), self.fs) \
|
|
402
|
+
if solve_budengshizu(list(self.rels.values()), Symbol(self.ui.budengshizu_ziyoubianliang.text()), self.fs) else "无解"
|
|
403
|
+
except:
|
|
404
|
+
result = "无解"
|
|
405
|
+
self.setWebEngineView('', latex(result), self.ui.budengshizu_jieji)
|
|
406
|
+
self.ui.budengshizu_jieji_lineedit.setText(str(result))
|