2

Python プログラムで numpy と mpmath を使用しています。多くの線形代数演算に簡単にアクセスできるため、numpy を使用します。しかし、一次方程式に対する numpy のソルバーはそれほど正確ではないため、より精度の高い演算には mpmath を使用します。システムの解を計算した後:

solution = mpmath.lu_solve(A,b)

解決策を配列として欲しい。だから私は使う

array = np.zeros(m)

次に、値を設定するためのループを実行します。

for i in range(m):
    array[i] = solution[i]

また

for i in range(m):
    array.put([i],solution[i])

しかし、どちらの方法でも、次のような数値的な不安定性が再び発生します。

solution[0] = 12.375
array[0] = 12.37500000000000177636

これらのエラーを回避する方法はありますか?

4

2 に答える 2

2

numpyndarray には同種の型があります。を作成するarrayと、デフォルトdtypeは浮動小数点型になり、必要な精度が得られません。

>>> array = np.zeros(3)
>>> array
array([ 0.,  0.,  0.])
>>> array.dtype
dtype('float64')

これを回避するには、次を使用しdtype=objectます。

>>> mp.mp.prec = 65
>>> mp.mpf("12.37500000000000177636")
mpf('12.37500000000000177636')
>>> array = np.zeros(3, dtype=object)
>>> array[0] = 12.375
>>> array[1] = mp.mpf("12.37500000000000177636")
>>> array
array([12.375, mpf('12.37500000000000177636'), 0], dtype=object)

ただし、これを行うとパフォーマンスが大幅に低下することに注意してください。

于 2014-01-16T15:30:08.887 に答える
1

完全を期すために、および numpy の線形ソルバーが十分に正確ではないためにこの質問に出くわした私のような人々のために (64 ビットの数値のみを処理できるようです)、sympyもあります。

API は numpy に多少似ていますが、時々微調整が必​​要です。

In [104]: A = Matrix([
[17928014155669123106522437234449354737723367262236489360399559922258155650097260907649387867023242961198972825743674594974017771680414642705007756271459833, 13639120912900071306285490050678803027789658562874829601953000463099941578381997997439951418291413106684405816668933580642992992427754602071359317117391198,  2921704428390104906296926198429197524950528698980675801502622843572749765891484935643316840553487900050392953088680445022408396921815210925936936841894852],
[14748352608418286197003564525494635018601621545162877692512866070970871867506554630832144013042243382377181384934564249544095078709598306314885920519882886,  2008780320611667023380867301336185953729900109553256489538663036530355388609791926150229595099056264556936500639831205368501493630132784265435798020329993,  6522019637107271075642013448499575736343559556365957230686263307525076970365959710482607736811185215265865108154015798779344536283754814484220624537361159],
[ 5150176345214410132408539250659057272148578629292610140888144535962281110335200803482349370429701981480772441369390017612518504366585966665444365683628345,  1682449005116141683379601801172780644784704357790687066410713584101285844416803438769144460036425678359908733332182367776587521824356306545308780262109501, 16960598957857158004200152340723768697140517883876375860074812414430009210110270596775612236591317858945274366804448872120458103728483749408926203642159476]])

In [105]: B = Matrix([
   .....: [13229751631544149067279482127723938103350882358472000559554652108051830355519740001369711685002280481793927699976894894174915494730969365689796995942384549941729746359],
   .....: [ 6297029075285965452192058994038386805630769499325569222070251145048742874865001443012028449109256920653330699534131011838924934761256065730590598587324702855905568792],
   .....: [ 2716399059127712137195258185543449422406957647413815998750448343033195453621025416723402896107144066438026581899370740803775830118300462801794954824323092548703851334]])

In [106]: A.solve(B)
Out[106]: 
Matrix([
[358183301733],
[498758543457],
[  1919512167]])

In [107]: 
于 2014-08-12T11:44:31.110 に答える