#!/usr/bin/env python # coding: utf-8 #

Table of Contents

#
# # 試験解答例18 # ## 簡単な行列計算 # In[1]: import numpy as np from pprint import pprint aa = np.array([[4,-1,-1], [1,2,-1],[3,-1,0]]) pprint(aa) # In[2]: import scipy.linalg as linalg inv_a = linalg.inv(aa) pprint(inv_a) # In[3]: pprint(np.dot(inv_a,aa)) # ## 数値解の収束性 # In[4]: import numpy as np def func(x): return -4*np.exp(-x)+2*np.exp(-2*x) def df(x): return 4*np.exp(-x) - 4*np.exp(-2*x) from scipy.optimize import fsolve x0 = fsolve(func, -1.0)[0] print(x0) # In[5]: import matplotlib.pyplot as plt x1=-1.0 x2=1.0 x = np.linspace(x1, x2, 100) y = func(x) plt.plot(x, y, color = 'k') plt.plot([x1,x2],[0,0]) plt.grid() plt.show() # In[6]: x1, x2 = -1.0, 0.0 f1, f2 = func(x1), func(x2) print('%+15s %+15s %+15s %+15s' % ('x1','x2','f1','f2')) print('%+15.10f %+15.10f %+15.10f %+15.10f' % (x1,x2,f1,f2)) list_bisec = [[0],[abs(x1-x0)]] for i in range(0, 10): x = (x1 + x2)/2 f = func(x) if (f*f1>=0.0): x1, f1 = x, f list_bisec[0].append(i) list_bisec[1].append(abs(x1-x0)) else: x2, f2 = x, f list_bisec[0].append(i) list_bisec[1].append(abs(x2-x0)) print('%+15.10f %+15.10f %+15.10f %+15.10f' % (x1,x2,f1,f2)) print(list_bisec) # In[7]: x1 = -1.0 f1 = func(x1) list_newton = [[0],[abs(x1-x0)]] print('%-15.10f %+24.25f' % (x1,f1)) for i in range(0, 10): x1 = x1 - f1 / df(x1) f1 =func(x1) print('%-15.10f %+24.25f' % (x1,f1)) list_newton[0].append(i) list_newton[1].append(abs(x1-x0)) print(list_newton) # In[8]: import matplotlib.pyplot as plt X = list_bisec[0] Y = list_bisec[1] plt.plot(X, Y) X = list_newton[0] Y = list_newton[1] plt.plot(X, Y) plt.yscale("log") # y軸を対数目盛に plt.show() # ## 精度,誤差 # In[9]: from decimal import * def pretty_p(result,a,b,operator): print('context.prec:{}'.format(getcontext().prec)) print(' %20.14f' % (a)) print( '%1s%20.14f' % (operator, b)) print('-----------') print( ' %20.14f' % (result)) # In[10]: getcontext().prec = 5 aa = '0.80000' bb = '3.1415' cc = '3.1234' a=Decimal(aa) b=Decimal(bb) c=Decimal(cc) pretty_p(b-c,b,c,'-') print(b-c) print(a/(b-c)) # In[11]: TWOPLACES = Decimal(10) ** -3 getcontext().prec = 4 a=Decimal(aa).quantize(Decimal(10) ** -4) b=Decimal(bb).quantize(Decimal('0.001')) c=Decimal(cc).quantize(Decimal('0.001')) pretty_p(b-c,b,c,'-') print(b-c) print(a/(b-c)) # In[12]: TWOPLACES = Decimal(10) ** -2 getcontext().prec = 3 a=Decimal(aa).quantize(Decimal(10) ** -3) b=Decimal(bb).quantize(Decimal('0.01')) c=Decimal(cc).quantize(Decimal('0.01')) pretty_p(b-c,b,c,'-') print(b-c) print(a/(b-c)) # In[13]: TWOPLACES = Decimal(10) ** -1 getcontext().prec = 2 a=Decimal(aa).quantize(Decimal(10) ** -2) b=Decimal(bb).quantize(Decimal('0.1')) c=Decimal(cc).quantize(Decimal('0.1')) pretty_p(b-c,b,c,'-') print(b-c) print(a/(b-c)) # ## 最小2乗法 # In[14]: import numpy as np from pprint import pprint aa = np.array([[-2.0, -561.78952], [-1.0, -564.14261], [0.0, -565.47273], [1.0, -565.8513], [2.0, -565.36457]]) at = np.transpose(aa) print(at) # In[15]: get_ipython().run_line_magic('matplotlib', 'notebook') import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit def f(x, a0, a1, a2): return a0 + a1*x + a2*x**2 xdata = np.array(at[0]) ydata = np.array(at[1]) plt.plot(xdata,ydata, 'o', color='r') params, cov = curve_fit(f, xdata, ydata) print(params) x =np.linspace(-2,2,20) y = f(x,params[0],params[1],params[2]) plt.plot(x,y, color='b') plt.grid() plt.show() # ## 常微分方程式 # In[16]: get_ipython().run_line_magic('matplotlib', 'inline') import numpy as np import matplotlib.pyplot as plt def my_plot(xx, vv, tt): plt.plot(tt, xx, color = 'b', linestyle='--',label="height") plt.plot(tt, vv, color = 'r', label="velocity") plt.legend() plt.xlabel('time') plt.ylabel('height and velocity') plt.grid() plt.show() def euler2(x0, v0): v1 = v0 + (-cc * v0- g) * dt x1 = x0 + v0 * dt return [x1, v1] # In[17]: g, dt, cc=9.8, 0.1, 1.0 # tt,xx,vv=[0.0],[0.0],[-10] tt,xx,vv=[0.0],[1000.0],[0.0] t = 0.0 for i in range(0,1200): t += dt x, v = euler2(xx[-1],vv[-1]) tt.append(t) xx.append(x) vv.append(v) my_plot(xx, vv, tt) # In[37]: xx[1030],xx[1031] # 地面につくのは,1030 x 0.1 = 103秒後 # In[39]: vv[1030] # 速度は,-9.8 m/sec,時速に直すと35.3km/hour. # In[38]: vv[1030]*3600/1000 # In[ ]: