前提・実現したいこと
パイソンで計算の精度を上げる方法を教えてください。
今回、流体の数値解析でパイソンを使って計算しています。
初期の値は対象的な数値なのですが
[0.6366197723675814, -0.6366197723675814]
計算後には
[0.4379113806521834, -0.4467526621560704]
値としては近いのですが、対象的ではない値になってしまいました。
(対象的な値になるように計算しています。)
計算課程でnumpy.sin, cos, numpy.dotで2x6行列などを途中で計算しており、
検索して見たところパイソンでfloat計算すると計算誤差が多く出てしまうという記事をいくつも見つけました。
一番解決方法で多かった、Decimal と Fraction を使った計算も試して見たのですが、sin, cos の計算など、を含めるとなかなか精度が上げられず、期待した答えを出すことができませんでした。
どなたか、パイソンで計算精度を上げる方法など教えていただけないでしょうか。
主に、
Python
1 a0L=a0[i-1] if (i > 0) else a0[-1] 2 a1L=a1[i-1] if (i > 0) else a1[-1] 3 4 a0R=a0[i+1] if (i < Ne-1) else a0[0] 5 a1R=a1[i+1] if (i < Ne-1) else a1[0] 6 7 #Put current potision 8 a0C=a0[i] 9 a1C=a1[i] 10 11 a_n = np.array([ [a0C],[a1C] ]) 12 a_tilda = np.array( [[a0L],[a1L],[a0C],[a1C],[a0R],[a1R]] ) 13 14 15 a_1 = a_n + (1/2)*D*dt/(h**2) * np.dot(A,a_tilda) 16 a1_tilda = np.array( [[a0L],[a1L],a_1[0],a_1[1],[a0R],[a1R]] ) 17 a_n_1 = a_n + (dt/2)*(D/h**2)*np.dot(A,a_tilda)+ (dt/2)*(D/h**2)*np.dot(A,a1_tilda)
の計算課程で、計算精度が落ちているように感じております。a1, a0 は全て float 型です。
python
1a0[i] = ( np.exp( -D*((2*math.pi/L)**2)*t ) ) * ( (L/(h*math.pi)) *np.sin((h*math.pi)/L) ) * np.sin( (2*math.pi/L)*x[i] ) 2 3a1[i] = ( 3*np.exp( -D*((2*math.pi/L)**2)*t ) ) * (L/(h*math.pi))* ( ( L/(h*math.pi))*np.sin((h*math.pi)/L) - np.cos((h*math.pi)/L))*(np.cos( (2*math.pi/L)*x[i] ))
Decimal型にできるところは変更しても、求めたい数値が出ずに困っております。
どなたか、numpyを使っても、複雑な計算問題でも使える、精度を上げる方法を教えていただけないでしょうか。
よろしくお願いいたします。