Результаты реализации алгоритма численного анализа в бесконечном цикле - PullRequest
1 голос
/ 01 мая 2020

Я пытался реализовать следующую функцию числового анализа для упражнения: создать сценарий python, который находит минимальное значение "n", необходимое для достижения точности станка для результата

enter image description here

enter image description here

Во-первых, я написал следующий код, предполагая, что точность станка составляет 1e-15 ( данный y (x) определен в функции fun (x).)

import math
import numpy as np

def fun(x):
    return float(x**4*(math.sqrt(x**2 + 9)))

i = 1
n_start = 2
n = n_start
y = 0.0
while True:
    if i == n:
        term_val = (math.pi/n)*y
        if n != n_start:
            print("term", term_val)
            print(abs(term_val - term_val_past))
            if abs(term_val - term_val_past) < 1e-15:
                print("Reached machine precision for n=", n)
                break
        y = 0.0
        n += 1
        i = 1
        term_val_past = term_val
    x_i =  math.cos((math.pi/(2*n))*(2*i-1))
    y += fun(x_i)
    i += 1

Этот код, кажется, работает вечно и не приближается к требуемой точности, однако он достигает 4 десятичной точности после while (ожидаемый результат - около 3.69412640477 и n = 12).

Не имея возможности найти проблему с моим решением, я переписал часть сценария, и теперь он работает нормально (достигнута требуемая точность для n = 12 )

import math
import numpy as np

def fun(x):
    return float(x**4*(math.sqrt(x**2 + 9)))

i = 1
n_start = 1
n = n_start
y = 0.0
while True:
    for i in range(1,n+1):
        x_i = math.cos(math.pi/(2*n)*(2*i-1))
        y += fun(x_i)
    term_val = (math.pi/n)*y
    if n != n_start:
        if abs(term_val - term_val_past) < 1e-15:
            print("Reached machine precision for n=", n)
            print("Result:", term_val)
            break
    y = 0.0
    n += 1
    term_val_past = term_val

Мне бы очень хотелось узнать, где я допустил ошибку в своем первом решении, это действительно ошеломляет меня.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...