Algebra.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. from sympy import *
  2. from sympy.plotting import plot3d,plot
  3. class Algebra_base:
  4. def __init__(self,new=lambda x:x):
  5. self.Name = {'self':self}#命名空间
  6. self.Name.update(globals())
  7. self.Name.update(locals())
  8. self.Algebra_dict = {}
  9. self.Algebra_dict_View = {}#门面
  10. self.Symbol_MS = {}#描述文件
  11. self.Take_News = new
  12. def Draw_Core(self,f):
  13. print(f'alg = {f}')
  14. re = []
  15. try:
  16. name = f.func.__name__
  17. args = f.args
  18. if name == 'Pow':
  19. try:
  20. if args[1] < 0:
  21. a = [['A', '1']]
  22. b = self.Draw_Core(f.func(args[0], -args[1]))
  23. print(b)
  24. re.append(['D', a, b])
  25. print(f'Qre = {re}')
  26. else:
  27. raise Exception
  28. except:
  29. a = self.Draw_Core(args[0])
  30. b = self.Draw_Core(args[1])
  31. re.append(['B', a, b])
  32. elif name == 'log':
  33. # a = [['A', '']]
  34. b = self.Draw_Core(args[0])
  35. re.append(['C', [['A', 'ln ']], b])
  36. elif name == 'Add':
  37. a = 0
  38. for i in args:
  39. get = self.Draw_Core(i)
  40. if a != 0:re.append(['A', ' + '])
  41. re += get
  42. a += 1
  43. elif name == 'Mul':
  44. a = 0
  45. for i in args:
  46. get = self.Draw_Core(i)
  47. if a != 0:re.append(['A', ' × '])
  48. re += get
  49. a += 1
  50. elif name == 'Rational':
  51. q = str(f).split('/')
  52. a = [['A', q[0]]]
  53. b = [['A', q[1]]]
  54. re.append(['D', a, b])
  55. # elif name in ['Symbol', 'One', 'Zero', 'NegativeOne', 'Float', 'Rational', 'Half']:
  56. # raise Exception
  57. elif len(args)<1:
  58. raise Exception
  59. else:#增添逗号
  60. re.append(['A', f'{str(name)}( '])
  61. a = 0
  62. for i in args:
  63. get = self.Draw_Core(i)
  64. if a != 0:re.append(['A', ' , '])
  65. re += get
  66. a += 1
  67. re.append(['A', ' )'])
  68. print(f'bRe={re}')
  69. return re
  70. except:
  71. a = str(f)
  72. try:
  73. if a[0] == '-':
  74. a = f'({a})'
  75. except:pass
  76. re.append(['A', a])
  77. return re
  78. def Simplify(self,alg,radio=1.7,func=None,rat=True,inv=False):#函数简化
  79. if func == None:func = count_ops
  80. try:
  81. self.Take_News('正在标准化')
  82. return simplify(alg,ratio=radio,func=func,rational=rat,inverse=inv)
  83. except:
  84. return None
  85. def rprint_expression(self,e, level=0, First=True):#直接打印
  86. e = simplify(e)#转换为sympy可以执行的对象
  87. return self.print_expression_core(e,level,First)
  88. def print_expression_core(self,e, level=0, First=True,q = 1):#递归
  89. str_print = ' ' * level
  90. if First: str_print = f'[{e}]\n' + str_print
  91. try:
  92. name = e.func.__name__
  93. args = e.args
  94. if args == (): raise Exception
  95. if name == 'log':name = 'ln'
  96. str_print += f'({q}){name}\n'
  97. n = len(name)
  98. for i in args:
  99. self.Take_News('正在迭代运算中')
  100. str_print += self.print_expression_core(i, level + n, First=False,q = q + 1)
  101. return str_print
  102. except:
  103. return str_print + f'({q}){str(e)}\n'
  104. def Split_Func_core(self,e,deep,f,first=True):#递归
  105. try:
  106. name = e.func.__name__
  107. args = e.args
  108. if name not in f or args == ():
  109. if f != ['All']:
  110. raise Exception
  111. else:
  112. deep = 1
  113. if deep == 1:
  114. if f == ['All'] and not first:
  115. re = [e]
  116. else:
  117. re = []
  118. for i in args:
  119. self.Take_News('正在迭代运算中')
  120. get = self.Split_Func_core(i, deep, f,False)
  121. re += get
  122. return re
  123. else:
  124. return args
  125. except:
  126. return [e]
  127. def Merge_Func_Core(self,name_list,Func):
  128. if len(name_list) < 2:
  129. return None
  130. st = name_list[0]
  131. for n in name_list[1:]:
  132. st = Func(st,n)
  133. return st
  134. def Creat_Num(self,num,num_type):
  135. try:
  136. if num_type == 0:#浮点数
  137. return Float(num)
  138. elif num_type == 1:#整数
  139. return Integer(num)
  140. elif num_type == 2:#有理数
  141. n = num.split('/')
  142. return Rational(n[0],n[1])
  143. else:
  144. return sympify(num,locals=self.Name)
  145. except:
  146. return Integer(1)
  147. class Algebra_Polynomial(Algebra_base):
  148. def __call__(self):
  149. alg_view = []
  150. alg = []
  151. for name in self.Algebra_dict:
  152. alg.append(name)
  153. alg_view.append(f'{name} --> {self.Algebra_dict[name]}')
  154. value = []
  155. value_view = []
  156. for name in self.Symbol_MS:
  157. value.append(name)
  158. value_view.append(f'符号:{name} --> {self.Symbol_MS[name]}')
  159. return (value_view,value),(alg_view,alg)
  160. def del_Symbol(self,x):
  161. del self.Symbol_MS[x]
  162. del self.Name[x]
  163. def addSymbol(self,name,AT=0,RI=0,PC=0,EO=0,FI=0,CIR=None,NZ=None,INT=0,NONE=0,ms='自定义符号'):#创建符号(ms=描述)
  164. k = {}
  165. try:
  166. name = name.replace(' ','')
  167. exec(f'{name} = 5',{})#测试name有没有做符号名字的资质
  168. if NONE == 1:raise Exception
  169. if AT == 1:#代数
  170. k['algebraic'] = True
  171. elif AT == 2:#超越数
  172. k['transcendental'] = True
  173. if RI == 1:#有理数
  174. k['rational'] = True
  175. elif RI == 2:#无理数
  176. k['irrational'] = True
  177. if PC == 1:#质数
  178. k['prime'] = True
  179. elif PC == 2:#合数
  180. k['composite'] = True
  181. if EO == 1:#偶数
  182. k['even'] = True
  183. elif EO == 2:#奇数
  184. k['odd'] = True
  185. if FI == 1:#有限实数
  186. k['finite'] = True
  187. elif FI == 2:#无穷
  188. k['infinite'] = True
  189. elif FI == 3:#广义实数
  190. k['extended_real'] = True
  191. if INT == 1:
  192. k['integer'] = True
  193. try:#避免CIR不是list而是None
  194. k[CIR[0]] = CIR[1]
  195. except:pass
  196. try:#避免NZ不是list而是None
  197. k[NZ[0]] = NZ[1]
  198. except:pass
  199. except:
  200. pass
  201. new_Name = self.Name.copy()
  202. new_Name.update({'k':k})
  203. try:
  204. exec(f"self.Name['{name}'] = Symbol('{name}',**k)",new_Name)#创建一个Symbols
  205. self.Symbol_MS[name] = ms
  206. return True
  207. except:
  208. return False
  209. # raise
  210. def Value_assumptions0(self,n):
  211. value = self.Name[n]
  212. get = value.assumptions0
  213. R_T = []
  214. R_F = []
  215. for i in get:
  216. if get[i]:
  217. R_T.append(f'{FY(i)} >>> {get[i]}')
  218. else:
  219. R_F.append(f'{FY(i)} >>> {get[i]}')
  220. return R_T + R_F
  221. def addAlgebra(self,name,alg):#设置代数式
  222. try:
  223. name = name.replace(' ','')
  224. try:
  225. exec(f'{name}=5',{})#检查name是否符合标准
  226. except:
  227. name = f'F{str(len(self.Algebra_dict))}'
  228. eval(f'{alg}',self.Name)#检查
  229. self.Algebra_dict[name] = sympify(alg,locals=self.Name)
  230. self.Algebra_dict_View[name] = str(alg)
  231. return True
  232. except:
  233. return False
  234. def del_Alg(self,name):
  235. del self.Algebra_dict[name]
  236. del self.Algebra_dict_View[name]
  237. def Tra_Alg(self):
  238. self.Algebra_dict = {}
  239. self.Algebra_dict_View = {}
  240. def get_Algebra(self,name,str = False):
  241. if str:
  242. return self.Algebra_dict_View[name]
  243. else:
  244. return self.Algebra_dict[name]
  245. def print_expression(self,name, level=0, First=True):#根据名字打印
  246. print(name)
  247. return self.print_expression_core(self.get_Algebra(name),level,First)
  248. def Split_Mul(self,name,renum=False,reone=False):
  249. alg = self.get_Algebra(name)
  250. r = factor(alg)
  251. b = list(factor_list(alg))
  252. c = []
  253. for i in b:
  254. if type(i) in (list, tuple):
  255. b += list(i)
  256. else:
  257. try:
  258. if renum:
  259. if reone:
  260. raise Exception
  261. else:
  262. if i == 1:continue
  263. else:
  264. Float(i)
  265. continue # 排除数字
  266. except:
  267. pass
  268. c.append(i)
  269. return c,r
  270. def Split_Add(self,name,Object,f):
  271. alg = self.get_Algebra(name)
  272. alg = expand(alg)
  273. coll = collect(alg,Object)
  274. coll_Dic = collect(alg,Object,evaluate=False)
  275. if f == 0:
  276. return list(coll_Dic.keys()),coll
  277. elif f == 1:
  278. return list(coll_Dic.values()),coll
  279. else:
  280. re = []
  281. for i in coll_Dic:
  282. re.append(i*coll_Dic[i])
  283. return re,coll
  284. def Split_Func(self,name,deep,f,must = True):
  285. alg = self.get_Algebra(name)
  286. if f == ['']:
  287. try:
  288. return alg.args,alg
  289. except:
  290. return None,alg
  291. get = self.Split_Func_core(alg, deep, f)
  292. re = []
  293. if not must:
  294. for i in get:
  295. try:
  296. if i.args != ():re.append(i)
  297. except:
  298. pass
  299. return re,alg
  300. return get, alg
  301. def Merge_Add(self, name_list):
  302. name = []
  303. for n in name_list:
  304. try:
  305. name.append(self.get_Algebra(n))
  306. except:pass
  307. return self.Merge_Func_Core(name,Add)
  308. def Merge_Mul(self, name_list):
  309. name = []
  310. for n in name_list:
  311. try:
  312. name.append(self.get_Algebra(n))
  313. except:pass
  314. return self.Merge_Func_Core(name,Mul)
  315. def Merge_Func(self, name_list,f):
  316. name = []
  317. func = self.Name[f]
  318. for n in name_list:
  319. try:
  320. name.append(self.get_Algebra(n))
  321. except:pass
  322. return self.Merge_Func_Core(name,func)
  323. def Fractional_merge(self,name):#最小公分母合并
  324. alg = self.get_Algebra(name)
  325. return ratsimp(alg)
  326. def Fraction_reduction(self,name):#分式化简
  327. alg = self.get_Algebra(name)
  328. return cancel(alg)
  329. def Fractional_fission(self,name,x):#分式裂项
  330. x = self.Name[x]
  331. alg = self.get_Algebra(name)
  332. return apart(alg,x)
  333. def as_Fraction(self,name,deep):#合成分式
  334. alg = self.get_Algebra(name)
  335. return together(alg,deep)
  336. def Fractional_rat(self,name,s,Max):#分母有理化
  337. alg = self.get_Algebra(name)
  338. return radsimp(alg,s,Max)
  339. def Trig_Simp(self,name):#三角化简
  340. alg = self.get_Algebra(name)
  341. return trigsimp(alg)
  342. def Trig_Expansion(self,name,deep):#三角化简
  343. alg = self.get_Algebra(name)
  344. return expand_trig(alg,deep)
  345. def Mul_Expansion(self,name):
  346. alg = self.get_Algebra(name)
  347. return expand_mul(alg)
  348. def Multinomial_Expansion(self,name):
  349. alg = self.get_Algebra(name)
  350. return expand_multinomial(alg)
  351. def Pow_Simp_Multinomial(self,name):
  352. alg = self.get_Algebra(name)
  353. return powdenest(alg)
  354. def Pow_Simp_base(self,name,JS):#处理底数
  355. return self.Pow_Simp(name,JS,'base')
  356. def Pow_Simp_exp(self,name,JS):#处理指数
  357. return self.Pow_Simp(name,JS,'exp')
  358. def Pow_Simp(self,name,JS,combine='all'):#均处理
  359. alg = self.get_Algebra(name)
  360. return powsimp(alg,force=JS,combine=combine)
  361. def Pow_Expansion_base(self,name,deep):
  362. alg = self.get_Algebra(name)
  363. return expand_power_base(alg,deep)
  364. def Pow_Expansion_exp(self,name,deep):
  365. alg = self.get_Algebra(name)
  366. return expand_power_exp(alg,deep)
  367. def Pow_Expansion(self,name,deep):
  368. alg = self.get_Algebra(name)
  369. return expand(alg,deep=deep, log=False, mul=False,
  370. power_exp=True, power_base=True, multinomial=True,
  371. basic=False)
  372. def log_Simp(self,name,fo):
  373. alg = self.get_Algebra(name)
  374. return logcombine(alg,fo)
  375. def log_Expansion(self,name,deep,fo):
  376. alg = self.get_Algebra(name)
  377. return expand_log(alg,deep,fo)
  378. def simplify(self,name,ratdio=1.7,func=None,rat=True,inv=False):
  379. alg = self.get_Algebra(name)
  380. self.Simplify(alg,ratdio,func,rat,inv)
  381. def expansion(self,name,IM):
  382. alg = self.get_Algebra(name)
  383. return expand(alg,complex=IM)
  384. def factor(self,name,M,GS,Deep,Rat):
  385. k = {}
  386. if M != None:k['modulus']=M
  387. if GS:k['gaussian']=True
  388. alg = self.get_Algebra(name)
  389. return factor(alg,deep = Deep,fraction=Rat,**k)
  390. def Collect(self,name,x):
  391. alg = self.get_Algebra(name)
  392. try:
  393. return collect(alg,x)
  394. except:
  395. return ceiling(alg)
  396. def complex_Ex(self,name):
  397. alg = self.get_Algebra(name)
  398. return expand_complex(alg)
  399. def func_Ex(self,name):
  400. alg = self.get_Algebra(name)
  401. return expand_func(alg)
  402. def to_num(self,name,n):
  403. alg = self.get_Algebra(name)
  404. return alg.evalf(n)
  405. def Sub_Value(self,name,Dic):
  406. alg = self.get_Algebra(name)
  407. sympy_Dic = {}#
  408. for i in Dic:#i是符号,Dic[i]是代数式名字
  409. try:
  410. v_alg = self.get_Algebra(Dic[i])#获得代数式
  411. get = self.Name[i]#处理符号
  412. sympy_Dic[get] = v_alg
  413. except:pass
  414. return alg.subs(sympy_Dic)
  415. def RSub_Value(self,name,Dic):
  416. alg = self.get_Algebra(name)
  417. sympy_Dic = {}
  418. for i in Dic:#i是代数式名字,Dic[i]是符号
  419. try:
  420. v_alg = self.get_Algebra(i)#获得代数式
  421. get = self.Name[Dic[i]]#处理符号
  422. sympy_Dic[v_alg] = get
  423. except:pass
  424. return alg.subs(sympy_Dic)
  425. def SubNum_Value(self,name,Dic):
  426. alg = self.get_Algebra(name)
  427. sympy_Dic = {}
  428. for i in Dic:#i是符号,Dic[i]是数字
  429. try:
  430. get = self.Name[i]#处理符号
  431. sympy_Dic[get] = Dic[i]
  432. except:pass
  433. return alg.subs(sympy_Dic)
  434. def Solve(self,alg_list):
  435. alg = []
  436. x_list = set()
  437. for i in alg_list:
  438. z = self.get_Algebra(i[0])
  439. y = self.get_Algebra(i[1])
  440. alg.append(Eq(z,y))
  441. x_list = x_list|alg[-1].atoms(Symbol)
  442. x_list = list(x_list)
  443. re = []
  444. for x in x_list:#遍历原子
  445. get = solve(alg,x,dict=True)
  446. for i in get:#遍历答案
  447. for a in i:
  448. re.append((a,i[a]))
  449. return re
  450. def Solve_Inequality(self,alg_list,Type_Num):
  451. Type = ['>','<','>=','<='][Type_Num]
  452. z = self.get_Algebra(alg_list[0])
  453. y = self.get_Algebra(alg_list[1])
  454. f = sympify(f'{z} {Type} {y}',locals=self.Name)
  455. print(f)
  456. answer = solve(f)
  457. if answer == True:
  458. return ['恒成立']
  459. elif answer == False:
  460. return ['恒不成立']
  461. get = self.Split_Func_core(answer,1,('Or'))
  462. return get
  463. def Rewrite(self,name,Func,DX,deep=False):
  464. alg = self.get_Algebra(name)
  465. f = sympify(Func,locals=self.Name)#重新函数
  466. if DX != []:
  467. ff = [] # 重写对象
  468. for i in DX:
  469. ff.append(sympify(i,locals=self.Name))
  470. return alg.rewrite(ff, f, deep=deep)
  471. else:
  472. return alg.rewrite(f, deep=deep)
  473. def Plot(self,name,list_2D,list_3D = None):
  474. list_2D = list_2D.copy()
  475. alg = self.get_Algebra(name)
  476. list_2D[0] = self.Name[list_2D[0]]
  477. if list_3D == None:
  478. self.Take_News('正在绘制图像')
  479. plot(alg, tuple(list_2D),xlabel=f'{list_2D[0]}',ylabel=f'{alg}',title='CoTan Algebra')
  480. else:
  481. list_3D = list_3D.copy()
  482. list_3D[0] = self.Name[list_3D[0]]
  483. self.Take_News('正在绘制图像')
  484. plot3d(alg, tuple(list_2D),tuple(list_3D), xlabel=f'{list_2D[0]}', ylabel=f'{list_3D[0]}',zlable=f'{alg}',title='CoTan Algebra')
  485. def Draw(self,name):
  486. alg = self.get_Algebra(name)
  487. return self.Draw_Core(alg)
  488. #提供翻译服务
  489. def FY(word):
  490. book = {'algebraic':'代数','transcendental':'超越数','rational':'有理数','irrational':'无理数',
  491. 'odd':'奇数','even':'偶数','negative':'负数','positive':'正数','zero':'零',
  492. 'complex':'复数','imaginary':'虚数','real':'实数','integer':'整数','prime':'质数',
  493. 'composite':'合数','finite':'有限数字','infinite':'无穷','extended_real':'广义实数',
  494. 'commutative':'满足交换律','hermitian':'厄米特矩阵','nonnegative':'非负数',
  495. 'nonpositive':'非正数','nonzero':'非零实数','noninteger':'非整数','extended_nonzero':'广义非零数',
  496. 'extended_negative':'广义负数','extended_nonpositive':'广义非正数','extended_nonnegative':'广义非负数',
  497. 'extended_positive':'广义正数'}
  498. try:
  499. CN = book[word]
  500. return f'{CN}({word})'
  501. except:
  502. return word