Кто-то может объяснить, почему scipy.integrate.quad дает различные результаты для одинаково больших расстояний при интеграции sin (x)?

Вы хотите агрегировать по sn, а также по failed_operation. Я также думаю, что вы можете упростить вычисление каждого столбца:

SELECT sn, Failed_operation,
       count(*) filter (where fail_timestamp > current_date and fail_timestamp < current_date + interval '15 day') as AgingLessThan15,
       count(*) filter (where fail_timestamp > current_date + interval '15 day' and fail_timestamp < current_date + interval '30 day') as Aging16To30,
       count(*) filter (where fail_timestamp > current_date + interval '30 day' and fail_timestamp < current_date + interval '600 day') as Aging31To60,
       count(*) filter (where fail_timestamp > current_date + interval '60 day') as AgingGreaterThan60,
       count(*) filter (where fail_timestamp <= current_date) as Aging0
FROM rw_pcba
WHERE rework_status = 'In-Process'
GROUP BY sn, Failed_operation
ORDER BY sn, Failed_operation ASC;

Я предпочитаю прямые сравнения дат для этого типа логики, а не работать с разницей между датами. Мне просто легче следовать. Например, использование current_date вместо now() снимает вопрос о том, что происходит с временной составляющей now().

РЕДАКТИРОВАТЬ:

В более старых версиях Postgres вы можете сформулировать это, используя сумму:

       sum( (fail_timestamp > current_date and fail_timestamp < current_date + interval '15 day')::int ) as AgingLessThan15,
5
задан batbrat 24 February 2009 в 10:56
поделиться

6 ответов

quad функция является функцией из старой библиотеки Fortran. Это работает путем оценки плоскостью и наклоном функции, которую это интегрирует, как рассматривать размер шага, который это использует для численного интегрирования для максимизации эффективности. То, что это означает, - то, что можно получить немного отличающиеся ответы от одного региона до следующего, даже если они - аналитически то же.

Без сомнения обе интеграции должна возвратить нуль. Возврат чего-то, что равняется 1 / (10 триллионов), достаточно близок к нулю! Незначительные различия происходят из-за пути quad переворачивается sin и изменение его размеров шага. Для Вашей запланированной задачи, quad будет все, в чем Вы нуждаетесь.

Править: Поскольку, что Вы делаете, я думаю quad прекрасен. Это быстро и довольно точно. Мой заключительный оператор является использованием это с уверенностью, если Вы не находите что-то, что действительно пошло вполне криво. Если это не дает бессмысленный ответ затем, это, вероятно, работает просто великолепно. Никакие заботы.

10
ответ дан 18 December 2019 в 05:40
поделиться

Я думаю, что это - вероятно, точность машины, так как оба ответа являются эффективно нулевыми.

Если бы Вы хотите ответ из первых уст, я отправил бы этот вопрос на scipy форуме

6
ответ дан 18 December 2019 в 05:40
поделиться

Я сказал бы, что номер O (10^-14) является эффективно нулевым. Каков Ваш допуск?

Могло бы случиться так, что алгоритм, лежащий в основе четверки, не является лучшим. Вы могли бы попробовать другой метод за интеграцию и видеть, улучшает ли это вещи. 5-й порядок, Рунге-Кутта, может быть очень хорошей техникой общего назначения.

Это могла быть просто природа чисел с плавающей точкой: "Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой".

6
ответ дан 18 December 2019 в 05:40
поделиться

Этот вывод кажется корректным мне, так как у Вас есть оценка абсолютной погрешности здесь. Интегральное значение sin (x), действительно должен иметь значение нуля в течение целого периода (любой интервал 2*pi длина) и в обычной и в числовой интеграции, и Ваши результаты близко к тому значению.
Для оценки длины дуги, необходимо вычислить интеграл для sqrt (1+diff (f (x), x) ^2) функция, где разность (f (x), x) является производной f (x). См. также длину дуги

4
ответ дан 18 December 2019 в 05:40
поделиться
0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

Оба ответа являются тем же и корректный т.е. нуль в рамках данного допуска.

3
ответ дан 18 December 2019 в 05:40
поделиться

Разница заключается в том, что sin (x) = - sin (-x) точно даже с конечной точностью. В то время как конечная точность дает только sin (x) ~ sin (x + 2 * pi) приблизительно. Конечно, было бы неплохо, если бы квад был достаточно умным, чтобы понять это, но у него действительно нет способа априори знать, что интеграл по двум указанным вами интервалам эквивалентен или что первый результат лучше.

2
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: