【表1-1】 from tkinter import * import math def initTk(Title):#Tkモジュール起動 root=Tk();root.title(Title) return root def initCanvas(root,W,H):#キャンパスの定義 canvas=Canvas(root,width=W,height=H) canvas.pack() return canvas def drawScale(canvas):#目盛り表示 CL="#CCCCCC"; CL2="#777777";CL3="#000000"; V=1.0 for i in range(1,12):#縦方向目盛り表示 Y=i*20 canvas.create_line(30,Y,430,Y,width=1,fill=CL) canvas.create_text(15,Y,text=("%3.1f" % V), font=('Times',8),fill=CL3) V-=0.2 V=0.0; dV=math.pi/10 for i in range(22):#横方向目盛り表示 X=i*20+30 if i % 5==0: canvas.create_line(X,20,X,220,width=1,fill=CL2) canvas.create_text(X,230,text=("%4.2f" % V), font=('Times',8),fill=CL3) else: canvas.create_line(X,20,X,220,width=1,fill=CL) V+=math.pi/10 canvas.create_line(30,120,430,120,width=1,fill=CL2) canvas.create_rectangle(30,20,430,220,width=1,fill="", outline=CL2) def drawV(Xb,Tb,Xa,Ta,CL):#値の描画 X1=Tb*100/math.pi+30;Y1=120-Xb*100 X2=Ta*100/math.pi+30;Y2=120-Xa*100 canvas.create_line(X1,Y1,X2,Y2,width=3,fill=CL) root=initTk("Numerical Analysis") canvas=initCanvas(root,440,240) canvas.pack(); drawScale(canvas) THdeg=40 #角度(この値を変更して実行する) TH=THdeg*math.pi/180 #度をラジアンに変更する Tb=0.0; X1b=TH*math.cos(Tb);X2b=TH #シミュレーション開始 dt=math.pi/20; V=0 for i in range(80): Ta=Tb+dt; X1a=TH*math.cos(Ta) drawV(X1b,Tb,X1a,Ta,'red') #近似値 V=V-dt*math.sin(X2b);X2a=X2b+dt*V drawV(X2b,Tb,X2a,Ta,'blue') #シミュレーション値 Tb=Ta; X1b=X1a; X2b=X2a  【表1-2】 import math V=1; X=-10; N=100; XX=X for i in range(1,N): V+=XX; XX=XX*X/(i+1) print("%4d, %f" %(i,V)) 【表1−5】 import math def myExpM(X): XX = abs(X); K = int(XX); XX = XX - K # 整数分を差し引く E = 1.0; N = 1; AX = 1.0; LastE=2.0 # 初期設定 while E!=LastE : # Expのマクローリン展開の収束計算 LastE = E; AX = AX*XX / N; E += AX N += 1 A = 2.71828182845905 # 整数分の乗算処理 while K > 0: if K & 1: E *= A # 2進数該当桁が1のとき乗算 K = int(K / 2); A *= A # 回数を2で除し,乗算すべき値を2乗 if X < 0 : E = 1/ E # 元の値が負のとき逆数にする。 return E 【表1-6】 def myExpM2(X): XX = abs(X); K = int(XX); XX = XX - K # 整数分を差し引く E = 1.0; N = 1; AX = 1.0; LastE=2.0 # 初期設定 while E!=LastE : # Expのマクローリン展開の収束計算 LastE = E; AX = AX*XX / N; E += AX N += 1 Alf = 0.523536028747135; P = Alf / (1 - Alf); PP = 1 + P # 補正用設定 A1 = 2.71828182845904; A2 = 2.71828182845905 # 整数分の乗算処理 while K > 0: if K & 1 : E *= (A1 + P * A2) / PP # 乗算の補正 K = int(K / 2); A1 *= A1; A2 *=A2 # 乗ずる値を2乗する。   if X < 0 :E = 1 / E # 元の値が負のとき逆数にする。 return E 【表1−7】プログラムのみ for X in range(-3,7): E1=myExpM(X); E2=myExpM2(X) print(X, E1, E2, math.log(E1),math.log(E2)) 【表1-8】 import math def myLog(X): N = 20 # Flog2は桁落ち対策用 log2 = 0.693147180559945; Flog2 = 3.09417232E-16 XX = abs(X) if XX < 0.0000000000001 :return -1E+308 L = 0 while XX >= 2: # L * log2分を加算 XX /= 2 # ここで桁落ちはないが L = (L+log2) + Flog2 # 減算のときと式を揃えるため while XX < 1: # XX < 1 のとき差し引く XX *= 2; L = (L - log2) - Flog2 # 桁落ち対策 XX -= 1; A = 0 #連分数展開 for i in range(N,0,-1): A = i * XX / (2 + i * XX / (2 * i + 1 + A)) return L + XX / (1 + A) for i in range(1,101):#確認用メイン X=0.1*i; Y=myLog(X); Z=math.exp(Y) print("%4.1f, %10.6f, %4.1f, %10.4e" %(X,Y,Z,Z-X)) 【表1-10】 import math def mySqrt(X): XX = abs(X); if XX < 1E-16: return 0.0 less1 = False if XX < 1: XX = 1/XX; less1 = True # 1より小さい時,逆数 N=1; NN=1 while N