Это будет длинный пост.
Этот вопрос не касается домашнего задания и/или работы, я безработный, бросил школу в 2017 году, мне сейчас 26 лет, и я изучил программирование полностью самостоятельно.
Прежде чем вы скажете «просто используйте числовую библиотеку», меня не волнует практичность, я пишу программы просто для развлечения. А методы численного интегрирования произвольной точности я уже реализовал на Python с нуля, они полностью рабочие, я их все написал полностью сам, большинство из них используют чистую целочисленную арифметику, я нашел формулы в Википедии, упростил математику и написал весь код. Но они не сходятся достаточно быстро. Мне нужны более точные цифры за меньшее количество итераций.
Как же мне удалось повсюду использовать целочисленную арифметику? Это просто, я просто использую дроби. Основная идея заключается в следующем: сложение двух дробей таково: a/b + c/d = (a * d + b * c)/(b * d), затем мы можем просто использовать пару целых чисел для разделения числителя и знаменателя, мы определяем (a, b) + (c, d) = (a * d + b * c, b * d), таким образом, числа всегда имеют бесконечную точность, в отличие от просто двойных чисел IEEE-754. log10(2)*53=15.954589770191003 десятичных цифр.
Сначала я использовал формулы Ньютона-Котеса из Википедии
Вот формулы:
Самая простая формула, которую я реализовал, - это правило Буля 4-го порядка, я реализовал порядки 4, 5 и 6.
Я вывел точные формулы для расчета арктангенса, используя формулы Ньютона-Котеса для порядков 4 и 5. Сначала производная арктангенса равна 1 / (x^2 + 1), выразите x как a/b, то мы имеем 1 / (a^2/b^2 + 1) = 1 / ((a^2 + b^2) / b^2) = b^2 / (a^2 + b^2). Подставьте производную в формулу Ньютона-Котеса, выразите числа с помощью дробей, сократите дроби, сложите дроби, чтобы получить многочлены, а затем используйте метод Хорнера для вычисления многочленов, обеспечивая таким образом наименьшее количество умножений, и тогда мы получим следующее:
Все работают. Попробуйте их, не верьте мне на слово.
Я также реализовал Гауссову квадратуру, используя веса из Википедии, я реализовал порядки 3, 4 и 5, веса указаны ниже:
Здесь есть квадратные корни. Теперь, если числа имеют вид a + b * sqrt(N), где N фиксировано, то сложение, вычитание, умножение и деление можно легко определить: (a + b * sqrt(N)) + (c + d * sqrt(N)) = (a + c + (b + d) * sqrt(N)) = (a + c, b + d), (a + b * sqrt(N)) - (c + d * sqrt(N)) = (a - c + (b -) d) * sqrt(N)) = (a - c, b - d), (a + b * sqrt(N)) * (c + d * sqrt(N)) = (a * c + N * b * d + (a * d + b * c) * sqrt(N)) = (a * c + N * b * d, a * d + b * c), (a + b * sqrt(N)) / (c + d * sqrt(N)) = ((a + b *) sqrt(N)) * (c - d * sqrt(N))) / ((c + d * sqrt(N)) * (c - d * sqrt(N))) = (a * c - N * b * d + (b * c - a * d) * sqrt(N)) / (c^2 - N * d^2) = ((a * c - N * b * d, b * c - a * d), (c^2 - N * d^2, 0)).
Но поскольку радикалы неоднородны, описанные выше трюки использовать нельзя, поэтому необходимо получать приближения. Я использовал gmpy2 для вычислений с плавающей запятой с произвольной точностью:
Это будет длинный пост. Этот вопрос не касается домашнего задания и/или работы, я безработный, бросил школу в 2017 году, мне сейчас 26 лет, и я изучил программирование полностью самостоятельно. Прежде чем вы скажете «просто используйте числовую библиотеку», меня не волнует практичность, я пишу программы просто для развлечения. А методы численного интегрирования произвольной точности я уже реализовал на Python с нуля, они полностью рабочие, я их все написал полностью сам, большинство из них используют чистую целочисленную арифметику, я нашел формулы в Википедии, упростил математику и написал весь код. Но они не сходятся достаточно быстро. Мне нужны более точные цифры за меньшее количество итераций. Как же мне удалось повсюду использовать целочисленную арифметику? Это просто, я просто использую дроби. Основная идея заключается в следующем: сложение двух дробей таково: a/b + c/d = (a * d + b * c)/(b * d), затем мы можем просто использовать пару целых чисел для разделения числителя и знаменателя, мы определяем (a, b) + (c, d) = (a * d + b * c, b * d), таким образом, числа всегда имеют бесконечную точность, в отличие от просто двойных чисел IEEE-754. log10(2)*53=15.954589770191003 десятичных цифр. Сначала я использовал формулы Ньютона-Котеса из Википедии Вот формулы: [img]https://i.sstatic.net/jtghO8cF.png[/img]
Самая простая формула, которую я реализовал, - это правило Буля 4-го порядка, я реализовал порядки 4, 5 и 6. Я вывел точные формулы для расчета арктангенса, используя формулы Ньютона-Котеса для порядков 4 и 5. Сначала производная арктангенса равна 1 / (x^2 + 1), выразите x как a/b, то мы имеем 1 / (a^2/b^2 + 1) = 1 / ((a^2 + b^2) / b^2) = b^2 / (a^2 + b^2). Подставьте производную в формулу Ньютона-Котеса, выразите числа с помощью дробей, сократите дроби, сложите дроби, чтобы получить многочлены, а затем используйте метод Хорнера для вычисления многочленов, обеспечивая таким образом наименьшее количество умножений, и тогда мы получим следующее: [code]def arctan_Boole(x: int, y: int) -> tuple[int, int]: y tuple[int, int]: return y * y, x * x + y * y
[/code] Все работают. Попробуйте их, не верьте мне на слово. Я также реализовал Гауссову квадратуру, используя веса из Википедии, я реализовал порядки 3, 4 и 5, веса указаны ниже: [img]https://i.sstatic.net/vUqON3o7.png[/img]
Здесь есть квадратные корни. Теперь, если числа имеют вид a + b * sqrt(N), где N фиксировано, то сложение, вычитание, умножение и деление можно легко определить: (a + b * sqrt(N)) + (c + d * sqrt(N)) = (a + c + (b + d) * sqrt(N)) = (a + c, b + d), (a + b * sqrt(N)) - (c + d * sqrt(N)) = (a - c + (b -) d) * sqrt(N)) = (a - c, b - d), (a + b * sqrt(N)) * (c + d * sqrt(N)) = (a * c + N * b * d + (a * d + b * c) * sqrt(N)) = (a * c + N * b * d, a * d + b * c), (a + b * sqrt(N)) / (c + d * sqrt(N)) = ((a + b *) sqrt(N)) * (c - d * sqrt(N))) / ((c + d * sqrt(N)) * (c - d * sqrt(N))) = (a * c - N * b * d + (b * c - a * d) * sqrt(N)) / (c^2 - N * d^2) = ((a * c - N * b * d, b * c - a * d), (c^2 - N * d^2, 0)). Но поскольку радикалы неоднородны, описанные выше трюки использовать нельзя, поэтому необходимо получать приближения. Я использовал gmpy2 для вычислений с плавающей запятой с произвольной точностью: [code]import gmpy2 import math from gmpy2 import get_context, mpfr, sqrt
ATAN_GAUSS = Arctan_Gaussian() ATAN_GAUSS.set_precision(100) [/code] И снова мой код работает отлично. Что дальше? Я реализовал метод Ромберга: [img]https://i.sstatic.net/0bk8OWuC.png[/img]
Он выглядит довольно сложным, но на самом деле он довольно прост: [img]https://i.sstatic.net/2ccjvYM6.jpg[/img]