Простые численные вычисления с питоном - PullRequest
1 голос
/ 28 октября 2019

Мы пишем на python в моем классе численного анализа, и я новичок в этом, поэтому я не очень уверен, что все сделал правильно и буду признателен за вашу помощь. С python мне нужно вычислить:

i) 0,01 ^ 2 и ввести ответ, округленный до 5 значащих цифр

ii) f (0,000122) где f (x) = cosh (x) +cos (x) - 2 и округлите свой ответ до 18 десятичных знаков.

iii) Рассчитайте абсолютную ошибку |f (x) - p_4 (x) |в точке 0,981, если p_4 (x) - это полином Тейлора 4-й степени, аппроксимирующий f (x) = exp (pi * x) с x_0 = 0

Что я сделал:

i)Мой код будет просто

x=0.001**2:
    print(x)

Здесь я получу 0,0001, но как мне теперь округлить это до 5 цифр?

ii) На этот раз у меня было:

import numpy as np
x = 0.000122
y = np.cosh(x) + np.cos(x) - 2
print(round(y, 18))

Но решение дает мне 0,0, и это кажется неправильным, потому что ... опять же, оно говорит, что оно округляется до 18 десятичных знаков.

iii) Здесь я только что начал с ряда Тейлора:

import math
x = math.pi*0.981
p4 = x**0/math.factorial(0) + x**1/math.factorial(1) + x**2/math.factorial(2) + x**3/math.factorial(3) + x**4/math.factorial(4)
print(p4)

Это нормально? Где я могу использовать это $ x_0 = 0 $? Я всегда не уверен, когда не использую каждый намек. Мой следующий шаг будет:

error=abs(math.e**(math.pi*0.981)-p4)

Это нормально?

1 Ответ

1 голос
/ 28 октября 2019

f(x) = cosh(x) + cos(x) - 2 по расширению Тейлора имеет значение

[1+x^2/2+x^4/24+...] + [1-x^2/2+x^4/24+...] - 2 = x^4/12 + O(x^8)

Однако ошибка вычисления этой формулы при данном значении x=1.22e-4 ограничена примерно 4*1.1e-16. Таким образом, точное значение меньше шума с плавающей запятой. Или, другими словами, формула содержит 2 или 3 случая катастрофической отмены. Невозможно получить желаемый результат с требуемым количеством правильных цифр.

Вы можете использовать тождества с двумя аргументами, чтобы немного это смягчить,

cosh(x)-1 = 2*sinh²(x/2)
cos(x) -1 = -2*sin²(x/2)
==> f(x) = 2*sinh²(x/2) - 2*sin²(x/2)

, чтобы

from math import sin, cos, sinh, cosh

x=1.22e-4
y = 2*(sinh(x/2)**2-sin(x/2)**2)
print("%.18e\n%.18e"%(y, x**4/12)

дает результаты

1.846112113571565333e-17
1.846112133333333120e-17

При оценке с высокой точностью можно получить более точные значения для исходной формулы

 1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 1746e-17

и модифицированной формулы

  1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 17468 16309 43036e-17

Даже здесь можно получить эффект отмены в первой формуле в том, что вторая формула дает больше цифр.

Сравнивая их с исходным результатом двойной точности, мы видим, что только 8 цифры точны в точной формуле, соответствующей оставшейся катастрофической отмене идентичных квадратичных членов Тейлора. Первый член разложения Тейлора имеет 16 правильных цифр, соответствующих относительной ошибке O (x ^ 4) ~ 1e-16 и точности с плавающей запятой того же размера.

...