Как избежать ошибки округления в этом списке? - PullRequest
0 голосов
/ 26 ноября 2018

Этот список должен иметь x [50] в качестве нуля и обе стороны должны быть симметричными, но он немного смещен от центра из-за того, что я предполагаю, является ошибкой округления.Как я могу изменить свой код, чтобы избежать этого?

Спасибо!

import numpy as np
L=2*np.pi
s=101
ds=L/(s-1)
svals=np.arange(1,101)
x=[0]
x[0:s]=((svals-1)*ds)-L/2
print(x)

1 Ответ

0 голосов
/ 26 ноября 2018

Получение точных результатов операций с плавающей запятой может быть сложным и сложным.Вы можете получить требуемый список, используя np.linspace:

x = np.linspace(-np.pi, 0, num=51)
x = np.concatenate([x, np.linspace(x[-1] - x[-2], np.pi, num=50)])
print(x)

Вывод:

[-3.14159265 -3.0787608  -3.01592895 -2.95309709 -2.89026524 -2.82743339
 -2.76460154 -2.70176968 -2.63893783 -2.57610598 -2.51327412 -2.45044227
 -2.38761042 -2.32477856 -2.26194671 -2.19911486 -2.136283   -2.07345115
 -2.0106193  -1.94778745 -1.88495559 -1.82212374 -1.75929189 -1.69646003
 -1.63362818 -1.57079633 -1.50796447 -1.44513262 -1.38230077 -1.31946891
 -1.25663706 -1.19380521 -1.13097336 -1.0681415  -1.00530965 -0.9424778
 -0.87964594 -0.81681409 -0.75398224 -0.69115038 -0.62831853 -0.56548668
 -0.50265482 -0.43982297 -0.37699112 -0.31415927 -0.25132741 -0.18849556
 -0.12566371 -0.06283185  0.          0.06283185  0.12566371  0.18849556
  0.25132741  0.31415927  0.37699112  0.43982297  0.50265482  0.56548668
  0.62831853  0.69115038  0.75398224  0.81681409  0.87964594  0.9424778
  1.00530965  1.0681415   1.13097336  1.19380521  1.25663706  1.31946891
  1.38230077  1.44513262  1.50796447  1.57079633  1.63362818  1.69646003
  1.75929189  1.82212374  1.88495559  1.94778745  2.0106193   2.07345115
  2.136283    2.19911486  2.26194671  2.32477856  2.38761042  2.45044227
  2.51327412  2.57610598  2.63893783  2.70176968  2.76460154  2.82743339
  2.89026524  2.95309709  3.01592895  3.0787608   3.14159265]

Это сделано в два шага, чтобы избежать числовой ошибки, которая возникает, когда интервал между 0Если x выполняется за один шаг как

x = np.linspace(-np.pi, np.pi, 101)

, тогда значение x[50] равно 4.440892098500626e-16, вместо x[50], равного 0, как и ожидалось.

...