在编写使用高斯方法计算函数积分的脚本时,我需要达到所需的计算精度delta
。这取决于参数j_els
。如果精度不满足指定值(误差在变量中可见err_gauss
),则必须将参数加倍,并且必须在内部函数内重新计算积分gauss()
。如果再次不满足,则参数j_els
再次加倍,依此类推,直到max_iter
达到所需的精度或指标(最大迭代次数)。
而且,用户请求的积分顺序n
不能超过6个。计算初始值时使用该顺序j_els
。功能的实现gauss_integrated(a, b)
是这样的,n
需要请求。
为了实现这一点,我编写了第 9 点,在 while 循环中我尝试达到所需的精度。但是,我不知道如何将具有双倍值的gauss()
变量传递j_els
给函数,因为它不是函数的参数。如何修复代码?我没有完整地展示剧本,只是展示了它的支撑点。第九段代码,同时完整展示。
import numpy as np
def func_for_integrate(x):
"""
Исходная функция для последующего интергрирования
"""
res = (1+np.sqrt(x))/(x**2)
return res
def gauss_integrated(a, b):
"""
Функция получения интеграла по методу Гаусса
"""
# 1. запросим порядок формулы и точность
n = int( input('Введите порядок формулы (количество узлов от 1 до 6): ') )
delta = float( input('Введите точность расчета (десятичная дробь): ') )
# 2. определим условие, при котором n не может быть меньше единицы и больше пяти
assert n>=1 and n<=5, 'Определите n от 1 до 6'
# 3. определим максимаьное количество итераций удвоения интервалов
max_iter = 100
# 4. определим словарь с коэффициентами t:
...
# 6. определим функцию расчета интеграла
def gauss(n):
...
# 6.4. определим переменную для параметра j
# ДАННЫЙ ПАРАМЕТР НЕОБХОДИМО УДАИВАТЬ ДЛЯ ТОЧНОСТИ
j_els = n-1
# 6.5. Рассчитаем интеграл с параметром j
...
# 6.5.2. получим значение интеграла по формуле
s_j = ( ((b-a)/(2*(j_els+1))) * sum_outside )
return s_j
# 7. создадим две переменных: одна с количеством интервалов n, другая - с (n+1)
integ_1 = gauss(n)
n += 1
integ_2 = gauss(n)
# 8. применим критерий точности вычисления
err_gauss = abs((integ_2 - integ_1)/integ_2)
# 9. с помощью цикла добьемся требуемой точности расчета
while err_gauss > delta:
if i <= max_iter:
i += 1
integ_1 = integ_2
j_els *= 2
integ_2 = gauss()
err_gauss = abs((integ_2 - integ_1)/integ_2)
# корректировка точности
if err_gauss <= delta:
break
else:
print('Достигнуто максимальное количество итераций')
break
# 10. Выведем результаты
print('Интеграл по методу Гаусса: ', integ_2)
print('Итоговое количество интервалов: ', j_els)