Python大作业_计算机&作图&单纯形法

先看代码

  1 # -*- coding: cp936 -*-
  2 '''
  3 使用单纯形法时,采用现在的这种头文件,不能出现from __future__ import division 
  4 使用计算器或画图时,务必把from __future__ import division 前面的#拿掉
  5 如果不想用复数计算,可以载入math,屏蔽cmath,此时plot里面的sin()不用写出m.sin()
  6 如果要复数计算,和前一行所说的相反
  7 屏蔽头文件的方法,加#;载入,则取消#
  8 '''                                  #calculator   plot  SM
  9 from __future__ import division     #    1         1     0
 10 from math import*                   #    0(推荐)    1    x
 11 #from cmath import*                  #    1(推荐)    0    x
 12 
 13 from graphics import *
 14 from math import fabs,ceil,floor
 15 import math as m
 16 from random import random
 17 from copy import deepcopy
 18 from time import sleep
 19 
 20 
 21 def stat(ilist):
 22     ave=0
 23     s=0
 24     s2=0
 25     n=len(ilist)
 26     for i in ilist:
 27         ave=ave+i/n
 28     for i in ilist:
 29         s2=(i-ave)**2/(n-1)
 30     s=sqrt(s2)
 31     return 'ave='+str(ave)+'\n'+'s='+str(s)
 32 
 33 
 34 '''________________________________class Rational___________________________'''
 35 class Rational:
 36     def __init__(self,num,den):
 37         if num%1!=0 or den%1!=0:
 38             exit(1)
 39         self.num=num
 40         self.den=den
 41         self.__RF()          
 42     def __RF(self):
 43         if self.num==0:
 44             self.den=1
 45         temp=min(abs(self.num),abs(self.den))
 46         while temp>1:
 47             if self.num%temp==0 and self.den%temp==0:
 48                 self.num=self.num/temp
 49                 self.den=self.den/temp
 50             temp=temp-1
 51         if self.den<0:
 52             self.num=-self.num
 53             self.den=-self.den
 54     def show(self):
 55         if self.den!=1:
 56             return str(self.num)+'/'+str(self.den)
 57         else:
 58             return str(self.num)
 59     def __add__(self,other):
 60         return Rational(self.num*other.den+self.den*other.num,self.den*other.den)
 61     def __sub__(self,other):
 62         return Rational(self.num*other.den-self.den*other.num,self.den*other.den)
 63     def __mul__(self,other):
 64         return Rational(self.num*other.num,self.den*other.den)
 65     def __div__(self,other):
 66         if other==Rational(0,1):
 67             exit(1)
 68         else:
 69             return Rational(self.num*other.den,self.den*other.num)
 70     def __pow__(self,n):
 71         if n%1==0:
 72             return Rational(self.num**n,self.den**n)
 73         else:
 74             print "Number Error"
 75     def floatify(self):                #for compare
 76         return 1.0*self.num/self.den
 77     def __gt__(self,other):
 78         return self.floatify() > other.floatify()
 79     def __lt__(self,other):
 80         return self.floatify() < other.floatify()
 81     def __ge__(self,other):
 82         return self.floatify() >= other.floatify()
 83     def __le__(self,other):
 84         return self.floatify() <= other.floatify()
 85     def __eq__(self,other):
 86         return self.floatify() == other.floatify()
 87     def __ne__(self,other):
 88         return not self == other
 89     def __iaddr__(self,other):
 90         self=self+other
 91     def __isubr__(self,other):
 92         self=self-other
 93     def __imulr__(self,other):
 94         self=self*other
 95     def __idivr__(self,other):
 96         self=self/other
 97     def __ipowr__(self,other):
 98         self=self**other
 99 '''_________________________________class iMatrix___________________________'''
100 class iMatrix:
101     def __init__(self):
102         self.win=GraphWin('simplex method',1095,410)   #1095 410
103         self.win.setBackground('#8497b0')
104         self.win.setCoords(0,0,61,28)
105         self.__createEntrys()
106         self.__createButton()
107         self.__createList()
108         self.__createInfoBar()
109         self.__createInfoEntrys()
110         self.t=Text(Point(28,26),'')
111         self.t.setTextColor('red')
112         self.t.setSize(20)
113     def __createInfoEntrys(self):
114         self.InfoEntrys=[]
115         for i in range(1,11,1):
116             self.InfoEntrys.append(Entry(Point(-2+5*i,23.5),2))
117         for i in range(10):
118             self.InfoEntrys[i].draw(self.win)
119     def __createInfoBar(self):
120         self.InfoBox=Rectangle(Point(1,25),Point(5,27))
121         self.InfoBox.setFill('red')
122         self.InfoBox.draw(self.win)
123         self.InfoBoxText=Text(Point(3,26),'Info')
124         self.InfoBoxText.draw(self.win)
125         self.InfoBar=Rectangle(Point(6,25),Point(50,27))
126         self.InfoBar.setFill('white')
127         self.Info=Text(Point(28,26),'Information')
128         self.Info.setTextColor('#d0cece')
129         self.Info.setSize(25)
130         self.InfoBar.draw(self.win)
131         self.Info.draw(self.win)
132     def __createEntrys(self):
133         self.entrys=[]
134         for i in range(11):
135             self.entrys.append([])
136             for j in range(11):
137                 self.entrys[i].append(Entry(Point(3+5*j,1.5+2*i),8))
138         for i in range(10):
139             self.entrys[0][i].setTextColor('red')
140         for i in range(10):
141             self.entrys[i+1][10].setTextColor('purple')
142         self.entrys[0][10].setTextColor('blue')
143         for i in range(11):
144             for j in range(11):
145                 self.entrys[i][j].setText('0')
146                 self.entrys[i][j].draw(self.win)
147     def __createButton(self):
148         self.button=Rectangle(Point(56,1),Point(60,22))
149         self.button.setFill('green')
150         self.button.draw(self.win)
151     def __createList(self):
152         self.List=[]
153         for i in range(11):
154             self.List.append([])
155             for j in range(11):
156                 self.List[i].append(0)
157     def getInfo(self):
158         self.InfoList=[]
159         for i in range(10):
160             if self.InfoEntrys[i].getText()!='':
161                 self.InfoList.append(eval(self.InfoEntrys[i].getText()))
162             else:
163                 self.InfoList.append(0)
164     def processInfo(self):
165         for i in range(10):
166             if self.InfoList[i]>0:
167                 if self.List[0][i]!=Rational(0,1):
168                     n_1=0
169                     n_0=0
170                     for j in range(1,self.row+1,1):
171                         if self.List[j][i]==Rational(0,1):
172                             n_0=n_0+1
173                         if self.List[j][i]==Rational(1,1):
174                             n_1=n_1+1
175                     if n_1==1 and n_0==self.row-1:
176                         self.t.setText('No solution!')
177                         self.t.draw(self.win)
178                         sleep(2)
179                         self.t.undraw(win)
180                         break
181         flag=0
182         for i in range(10):
183             if self.List[0][i]==Rational(0,1) and (not(i in self.BlankColumn)):
184                 n_1=0
185                 n_0=0
186                 for j in range(1,self.row+1,1):
187                     if self.List[j][i]==Rational(0,1):
188                         n_0=n_0+1
189                     if self.List[j][i]==Rational(1,1):
190                         n_1=n_1+1
191                 if n_1!=1 or n_0!=self.row-1:
192                     self.t.setText('Infinity solutions!')
193                     self.t.draw(self.win)
194                     sleep(2)
195                     self.t.undraw()
196                     flag=1
197                     break
198         if flag==0:
199             self.t.setText('One solution')
200             self.t.draw(self.win)
201             sleep(2)
202             self.t.undraw()
203     def getNum(self):
204         for i in range(11):
205             for j in range(11):
206                 temp=self.entrys[i][j].getText()
207                 if temp=='':
208                     self.List[i][j]=Rational(0,1)
209                 elif '/' in temp:
210                     n=temp.index('/')
211                     a=eval(temp[:n])
212                     b=eval(temp[n+1:])
213                     self.List[i][j]=Rational(a,b)
214                 else:
215                     self.List[i][j]=Rational(eval(temp),1)
216         self.row=10
217         for i in range(10,0,-1):
218             if max(self.List[i])==Rational(0,1) and min(self.List[i])==Rational(0,1):
219                 self.row=i-1
220             else:
221                 break
222         if self.row==0:
223             exit(1)
224         self.BlankColumn=[]
225         for j in range(10):
226             flag=0
227             for i in range(11):
228                 if self.List[i][j]!=Rational(0,1):
229                     flag=flag+1
230             if flag==0:
231                 self.BlankColumn.append(j)
232         #self.column=len(self.BlankColumn)
233     def printList(self):
234         for i in range(self.row,-1,-1):
235             print '\n'
236             for j in range(11):
237                 if not (j in self.BlankColumn):
238                     print '%8s' %(self.List[i][j].show()),
239                 
240     def whether_0(self):
241         temp=max(self.List[0][0:10])
242         self.centerX=self.List[0].index(temp)
243         return(temp)
244     def findXY(self,delta):
245         self.centerX=self.List[0].index(delta)
246         for i in range(1,self.row+1,1):
247             if self.List[i][self.centerX]>Rational(0,1):
248                 self.centerY=i
249                 temp1=self.List[i][10]/self.List[i][self.centerX]
250                 break
251         for i in range(1,self.row+1,1):
252             if self.List[i][self.centerX]>Rational(0,1):
253                 temp2=self.List[i][10]/self.List[i][self.centerX]
254                 if temp2<temp1:
255                     self.centerY=i
256                     temp1=temp2
257 
258     def unitify(self,row,column):   # row ~ list
259         center=self.List[row][column]
260         for i in range(11):
261             self.List[row][i]/=center
262     def step(self,list1,list2,column):
263         rate=self.List[list2][column]/self.List[list1][column]
264         for i in range(11):
265             self.List[list2][i]-=rate*self.List[list1][i]
266     def show(self):
267         for i in range(self.row+1):
268             for j in range(11):
269                 self.entrys[i][j].setText(self.List[i][j].show())
270     def runOneTime(self):
271         p=self.win.getMouse()
272         if 56<p.getX()<60 and 1<p.getY()<22:
273             self.getNum()
274             while 1:
275                 temp=self.whether_0()
276                 if temp>Rational(0,1):
277                     flag=0
278                     for i in range(1,1+self.row,1):
279                         if self.List[i][self.centerX]>Rational(0,1):
280                             flag=1
281                             break
282                     if flag==0:
283                         self.show()     #change numbers in the self.Entrys
284                         self.t.setText('Unbounded Solution')
285                         self.t.draw(self.win)
286                         sleep(2)
287                         self.t.undraw()
288                         break
289                     else:
290                         self.findXY(temp)
291                         self.unitify(self.centerY,self.centerX)
292                         for i in range(0,self.row+1,1):
293                             if i!=self.centerY:
294                                 self.step(self.centerY,i,self.centerX)
295                     #self.printList()
296                 else:
297                     self.show()
298                     self.getInfo()
299                     self.processInfo()    #change sentence in the InfoBar 
300                     break
301     def run(self):
302         while 1:
303             self.runOneTime()
304 
305 '''__________________________________class Button___________________________'''
306 class Button:
307     def __init__(self, win, center, width, height, label,color='lightgray'):
308         w,h = width/2.0, height/2.0
309         x,y = center.getX(), center.getY()
310         self.xmax, self.xmin = x+w, x-w
311         self.ymax, self.ymin = y+h, y-h
312         p1 = Point(self.xmin, self.ymin)
313         p2 = Point(self.xmax, self.ymax)
314         self.color=color
315         self.rect = Rectangle(p1,p2)
316         self.rect.setFill(self.color)
317         self.rect.draw(win)
318         self.label = Text(center, label)
319         self.label.draw(win)
320         self.deactivate()
321     def clicked(self, p):
322         return self.active and \
323         self.xmin <= p.getX() <= self.xmax and \
324         self.ymin <= p.getY() <= self.ymax
325 
326     def getLabel(self):
327         return self.label.getText()
328 
329     def activate(self):
330         self.label.setFill('black')
331         self.rect.setWidth(2)
332         self.active = 1
333 
334     def deactivate(self):
335         self.label.setFill('slategrey')
336         self.rect.setWidth(1)
337         self.active = 0
338         
339 '''_____________________________class Painting_______________________________'''
340 class Painting:
341     def __init__(self):
342         self.win=GraphWin("Painting here ~~",600,600)
343         self.win.setCoords(-1,-0.6,8,8)
344         self.entry=Entry(Point(4.5,7.5),28)
345         self.entry.setTextColor('purple')
346         self.entry.setStyle('italic')
347         self.entry.setSize(20)     
348         self.entry.draw(self.win)      
349         self.t=Text(Point(0.8,7.5),"f(x)=")    
350         self.t.setSize(20)     
351         self.t.draw(self.win)    
352         self.t1=Text(Point(1,6.5),"x  from")    
353         self.t1.setSize(20)   
354         self.t1.draw(self.win)    
355         self.t1_entry=Entry(Point(2.5,6.5),6)
356         self.t1_entry.setTextColor('purple')
357         self.t1_entry.setSize(20)  
358         self.t1_entry.draw(self.win)  
359         self.t2=Text(Point(3.7,6.5),'to')     
360         self.t2.setSize(20)      
361         self.t2.draw(self.win)      
362         self.t2_entry=Entry(Point(5,6.5),6)
363         self.t2_entry.setTextColor('purple')
364         self.t2_entry.setSize(20)       
365         self.t2_entry.draw(self.win)
366 
367         self.l=Line(Point(0,6),Point(8,6))
368         self.l.draw(self.win)
369         self.button=Rectangle(Point(6,6.2),Point(7.6,6.8))
370         self.button.setFill('pink')
371         self.button.draw(self.win)
372         self.button_text=Text(Point(6.8,6.5),'Plot')
373         self.button_text.draw(self.win)
374         
375         line1=Line(Point(0,0),Point(0,5.9))
376         line1.setArrow('last')
377         line1.draw(self.win)
378         line2=Line(Point(0,0),Point(7.9,0))
379         line2.setArrow('last')
380         line2.draw(self.win)
381         for i in range(10):
382             t=Text(Point(i*0.8,0),'|')
383             t.draw(self.win)
384         for i in range(10):
385             t=Text(Point(0,0.6*i),'-')
386             t.draw(self.win)
387             
388     def getNum(self):
389         self.s=self.entry.getText()
390         self.lhs=eval(self.t1_entry.getText())
391         self.rhs=eval(self.t2_entry.getText())
392     def processNum(self):
393         self.d=self.rhs-self.lhs
394         self.list1=[]
395         self.list2=[]
396         for i in range(1000):
397             self.list1.append(self.lhs+self.d*i/1000)
398         for i in range(1000):
399             x=self.list1[i]
400             self.list2.append(eval(self.s))
401         self.min=min(self.list2)
402         self.max=max(self.list2)
403         rate1=8/(self.rhs-self.lhs)
404         rate2=6/(self.max-self.min)
405         self.list11=[]
406         self.list22=[]
407         for i in self.list1:
408             self.list11.append((i-self.lhs)*rate1)
409         for i in self.list2:
410             self.list22.append((i-self.min)*rate2)
411     def paintNum(self):
412         for i in range(1000):
413             p=Point(self.list11[i],self.list22[i])
414             p.draw(self.win)
415         for i in range(10):
416             t=Text(Point(i*0.8,-0.25),str(round(self.lhs+(self.rhs-self.lhs)*i/10,3)))
417             t.setSize(11)
418             t.draw(self.win)
419         for i in range(10):
420             t=Text(Point(-0.4,0.6*i),str(round(self.min+(self.max-self.min)*i/10,3)))
421             t.setSize(11)
422             t.draw(self.win)
423     
424     def run(self):
425         while 1:
426             pp=self.win.getMouse()
427             if 6<pp.getX()<7.6  and  6.2<pp.getY()<6.8:
428                 '''self.getNum()
429                 self.processNum()
430                 self.paintNum()'''
431                 try:
432                     self.getNum()
433                     self.processNum()
434                     self.paintNum()
435                 except:
436                     t=Text(Point(4,3),'SomeThing Error')
437                     t.setSize(20)
438                     t.setTextColor('red')
439                     t.draw(self.win)
440                     sleep(2)
441                     t.undraw()
442 
443 '''___________________________class Calculator_______________________________'''
444 class Calculator:
445     def __init__(self):
446         win = GraphWin("calculator",440,600)
447         win.setCoords(0,-2,7,11)
448         win.setBackground("slategray")
449         self.win = win
450         self.__createButtons()
451         self.__createDisplay()
452         global ans
453     def setAns(a):
454         ans=deepcopy(a)
455     def __createButtons(self):
456         buttonSpecs = [(1,1,'0','#c65911'),(2,1,'.','#c65911'),(3,1,',','#c65911'),(4,1,'pi','#ffe699'),(5,1,'e','#ffe699'),(6,1,'j','#ffe699'),
457                        (1,2,'1','#c65911'),(2,2,'2','#c65911'),(3,2,'3','#c65911'),(4,2,'DEL','#ffe699'),(5,2,'AC','#ffe699'),(6,2,'ans','#ffe699'),
458                        (1,3,'4','#c65911'),(2,3,'5','#c65911'),(3,3,'6','#c65911'),(4,3,'+','#aeaaaa'),(5,3,'-','#aeaaaa'),(6,3,'/','#aeaaaa'),
459                        (1,4,'7','#c65911'),(2,4,'8','#c65911'),(3,4,'9','#c65911'),(4,4,'*','#aeaaaa'),(5,4,'**','#aeaaaa'),(6,4,'%','#aeaaaa'),
460                        (1,5,'fabs','#a9d08e'),(2,5,'ceil','#a9d08e'),(3,5,'floor','#a9d08e'),(4,5,'sqrt','#a9d08e'),(5,5,'(','#a9d08e'),(6,5,')','#a9d08e'),
461                        (1,6,'rand','#a9d08e'),(2,6,'stat','#a9d08e'),(3,6,'max','#a9d08e'),(4,6,'ln','#a9d08e'),(5,6,'lg','#a9d08e'),(6,6,']','#a9d08e'),
462                        (1,7,'sin','#00b0f0'),(2,7,'cos','#00b0f0'),(3,7,'tan','#00b0f0'),(4,7,'sinh','#00b050'),(5,7,'cosh','#00b050'),(6,7,'tanh','#00b050'),
463                        (1,8,'asin','#00b0f0'),(2,8,'acos','#00b0f0'),(3,8,'atan','#00b0f0'),(4,8,'ash','#00b050'),(5,8,'ach','#00b050'),(6,8,'ath','#00b050')
464                       ]
465         self.buttons = []
466         for cx,cy,label,color in buttonSpecs:       
467             self.buttons.append(Button(self.win,Point(cx,cy),1,1,label,color))
468         self.buttons.append(Button(self.win,Point(3.5,0),6,1,"=",'#806000'))
469         self.buttons.append(Button(self.win,Point(2,-1),3,1,"plot",'pink'))
470         self.buttons.append(Button(self.win,Point(5,-1),3,1,"Simplex Method",'orange'))
471         for b in self.buttons:
472             b.activate()
473             
474     def __createDisplay(self):
475         bg = Rectangle(Point(0.5,8.5), Point(6.5,10.5))
476         bg.setFill('white')
477         bg.draw(self.win)
478         text = Text(Point(3.5,9.5), "")
479         text.draw(self.win)
480         text.setFace("courier")
481         text.setStyle("bold")
482         text.setSize(16)
483         self.display = text
484         
485     def getKeyPress(self):
486         while 1:
487             p = self.win.getMouse()
488             for b in self.buttons:
489                 if b.clicked(p):
490                     return b.getLabel() 
491     def processKey(self, key):
492         global ans
493         text = self.display.getText()
494         if key == 'AC':
495             self.display.setText("")
496         elif key in ['fabs','ceil','floor','sqrt','max','sin','cos','tan','sinh','cosh','tanh','asin','acos','atan']:
497             self.display.setText(text+key+'(')
498         elif key == 'stat':
499             self.display.setText(text+'stat([')
500         elif key == 'rand':
501             self.display.setText(text+'random()')
502         elif key == 'ln':
503             self.display.setText(text+'log(')
504         elif key == 'lg':
505             self.display.setText(text+'log10(')
506         elif key == 'ash':
507             self.display.setText(text+'asinh(')
508         elif key == 'ach':
509             self.display.setText(text+'acosh(')
510         elif key == 'ath':
511             self.display.setText(text+'atanh(')
512         elif key == 'DEL':     
513             self.display.setText(text[:-1])
514         elif key == 'plot':
515             self.win.close()
516             paintor=Painting()
517             paintor.run()
518         elif key == 'Simplex Method':
519             self.win.close()
520             ms=iMatrix()
521             ms.run()
522         elif key == '=':
523             try:
524                 result = eval(text)
525                 ans=result
526             except:
527                 result = 'ERROR'
528             self.display.setText(str(result))
529         else:
530             self.display.setText(text+key)
531 
532     def run(self):
533         while 1:
534             key = self.getKeyPress()
535             self.processKey(key)
536 '''
537 def main():
538     theCalc = Calculator()
539     theCalc.run()
540 main()
541 '''
542 theCalc=Calculator()
543 theCalc.run()

程序分为三个部分,打开程序后先进入Calculator界面,然后可以选择进入另外两个

l  Calculator(科学计算器)

l  Plot(作图)

l  Simplex Method(单纯形法解决运筹学问题)

具体的程序说明见http://wl.ibox.sjtu.edu.cn/w/8967O6X0p47978y3/ReadMe.docx

2013-06-2422:38:08

posted @ 2013-06-24 22:39  wkl7123  阅读(2893)  评论(0)    收藏  举报