Строго говоря, есть свойства идеальной матрицы Вандермонда и свойства округлённой до заданной точности матрицы Вандермонда, и они отличаются. Отдельный вопрос - сетка, который тоже имеет много гититк, ну пусть останется равномерной:
from mpmath import mp
import matplotlib.pyplot as plt
%config InlineBackend.figure_format='retina'
def vandermonde_matrix(n):
A = mp.zeros(n+1)
for i in range(n+1):
for j in range(n+1):
A[i, j] = (mp.mpf(i)/mp.mpf(n))**j if n else 1
return A
fig, ax1 = plt.subplots(nrows=1)
for prec, hiprec in (24, 113), (53, 237), (113, 489):
mp.prec = prec
cond_vandermonde = mp.zeros(1, 101)
cond_vandermonde_hi = mp.zeros(1, 101)
rng = range(1, len(cond_vandermonde))
for i in rng:
mp.prec = prec
dps = mp.dps
matrix = vandermonde_matrix(i)
S = mp.svd_r(matrix, compute_uv = False)
cond_vandermonde[i]=max(S)/min(S)
mp.prec = hiprec
hidps = mp.dps
S = mp.svd_r(matrix, compute_uv = False)
cond_vandermonde_hi[i]=max(S)/min(S)
ax1.semilogy(rng, cond_vandermonde[1:],
label=f"vm={dps} cnd={dps}")
ax1.semilogy(rng, cond_vandermonde_hi[1:],
label=f"vm={dps} cnd={hidps}")
ax1.set_title('''Зависимость числа обусловленности от n и от
точности представления матрицы Вандермонда (vm)''')
ax1.set_ylabel('Число обусловленности')
ax1.legend()
ax1.set_xlabel('n')
plt.show()
ошибок в вычислениях нет.
Конечно же, есть. Во-первых, метод вычисления числа обусловленности выбран не самый точный, в NumPy есть быстрая функция np.linalg.cond(matrix), а есть более точное разложение np.linalg.svd(matrix, compute_uv=False).
Легко видеть, что число обусловленности идеальной матрицы Вандермонда неограниченно растёт по одному закону, округленной матрицы Вандермонда тоже растёт неограниченно, но по другому закону точка перегиба: . Ну, а вычисленная оценка числа обусловленности ограничена точностью её вычисления.
Попробуйте поменять тип данных в матрице на np.float32 (по умолчанию там float64).
Это да, точность входной матрицы влияет.
Точности вещественных числел тупо не хватает для вычисления обратной матрицы.
А в этом деле, тест с использованием np.float32 практически бесполезен, поскольку NumPy всё равно накапливает скалярное произведение на np.float64.
import numpy as np
import matplotlib.pyplot as plt
def vandermonde_matrix(n, dtype=float, htype=np.longdouble):
A = np.zeros((n+1,n+1), dtype=dtype)
for i in range(n+1):
for j in range(n+1):
A[i][j] = (htype(i)/htype(n))**htype(j) if n != 0 else 1
return A
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
for dt in np.float32, np.float64:
for ht in np.float32, np.longdouble:
cond_vandermonde = np.zeros(101, dtype=dt)
underflow = np.zeros_like(cond_vandermonde)
rng = range(1, len(cond_vandermonde))
for i in rng:
matrix = vandermonde_matrix(i, dtype=dt, htype=ht)
#cond_vandermonde[i] = np.linalg.cond(matrix)
U, S, V = np.linalg.svd(matrix)
cond_vandermonde[i]=np.max(S)/np.min(S)
#np.testing.assert_approx_equal(np.linalg.cond(U), 1.0)
#np.testing.assert_approx_equal(np.linalg.cond(V), 1.0)
#np.testing.assert_approx_equal(np.max(S)/np.min(S),
# np.linalg.cond(np.diag(S)))
#if cond_vandermonde[i] < 1/np.finfo(dt).eps:
# np.testing.assert_approx_equal(np.max(S)/np.min(S),
# np.linalg.cond(matrix))
underflow[i] = (i + 1)**2 - i - np.count_nonzero(matrix)
ax1.semilogy(rng, cond_vandermonde[1:],
label=f"m={np.finfo(ht).precision} c={np.finfo(dt).precision}")
ax2.plot(rng, underflow[1:],
label=f"m={np.finfo(ht).precision} c={np.finfo(dt).precision}")
ax1.set_title('Зависимость числа обусловленности от n')
ax1.set_ylabel('Число Обусловленности')
ax1.legend()
ax2.set_ylabel('Число антипереполнений')
ax2.set_xlabel('n')
ax2.legend()
plt.show()
придется писать руками методом Гаусса, да и вычисление нормы тоже.
Я Вас умоляю...
from mpmath import mp
import matplotlib.pyplot as plt
def vandermonde_matrix(n):
A = mp.zeros(n+1)
for i in range(n+1):
for j in range(n+1):
A[i, j] = (mp.mpf(i)/mp.mpf(n))**j if n else 1
return A
fig, ax1 = plt.subplots(nrows=1)
for dps in 6, 15, 33:
mp.dps = dps
cond_vandermonde = mp.zeros(1, 61)
rng = range(1, len(cond_vandermonde))
for i in rng:
matrix = vandermonde_matrix(i)
S = mp.svd_r(matrix, compute_uv = False)
cond_vandermonde[i]=max(S)/min(S)
ax1.semilogy(rng, cond_vandermonde[1:],
label=f"dps={S[0].context.dps}")
ax1.set_title('Зависимость числа обусловленности от n')
ax1.set_ylabel('Число Обусловленности')
ax1.legend()
ax1.set_xlabel('n')
plt.show()
Погуглите свойства этой самой матрицы. Уверен, для числа обусловленности есть какая-нибудь аж замкнутая формула.
Как бы, есть, только она всё равно от сетки зависит. Впрочем, для данной конкретной сетки, на графике и так всё видно.
Интересно, есть ли тому объяснение, что precomit.sh должен начинаться не с обычного шебанг #!, а с какого-нибудь непустого, к примеру, с эквивалента пустого шебанга: #!/usr/bin/env sh ?
Прошу прощения, но режет глаз. Разрешите напомнить современное, более менее строгое, определение, параграф 13 раздел 6.10.1 Conditional inclusion, C23:
...After all replacements due to macro expansion and evaluations of defined macro expressions, has_include expressions, has_embed expressions, and has_c_attribute expressions have been performed, all remaining identifiers other than true (including those lexically identical to keywords such as false) are replaced with the pp-number 0, true is replaced with pp-number 1, and then each preprocessing token is converted into a token...
И так было всегда, например, параграф 6 (примерно) раздел 3.8.1 Conditional inclusion, C88 Third review X3J11 88-090 May 13 1988:
...After all replacements are finished, the resulting preprocessing tokens are converted into tokens, and then all remaining identifiers are replaced with 0 ...
В первой редакции книги K&R, вроде как, это свойство забыли упомянуть, но аксакалы помнят, помнят, как работал их компилятор.
Это как посмотреть, код if (index < 0 || index >= forecast.Forecast.Count) проблемный - не работает с NaN, а если написать if (0 <= index && index < forecast.Forecast.Count), то при работе по IEC 60559, всё будет корректно.
А так, да, конечно, лучше, когда всё вместе, и интерфейс надёжный, и код надёжный. Хотя, NaN может просочиться и через интерфейс без деления, например, ввиду недостатка данных.
Честно говоря, модель Mail.Ru (Яндекс, и др.) не предусматривает такового "хранения", переустановка или новое устройство - новый ключ. А "хранение" - это лишнее, необязательное и небезопасное действие.
Впрочем, если, лично Вам, оно нравится и у Вас есть специальный шифрблокнот для этого, почему нет?
Мне кажется, данные вообще нерелевантные ни для какого вывода, кроме "кто лежит на одном из кладбищ в одном из небольших городков"...
На первом году жизни умирало очень много людей из нашей выборки, на втором тоже нмало. Но дальше цифры вполне равномерные, не кажется?
Возрастные коэффициенты смертности мирных лет (1896-1897), смертей на 1000 данного возраста:
0.: 370.0 (от рождения до года) 0-1.: 132.5 (от рождения до двух лет) 5-9.: 11.9 10-14.: 5.4 15-19.: 5.8 20-24.: 7.5 25-29.: 8.1 30-34.: 8.7 35-39.: 10.3 40-44.: 11.8 45-49.: 15.6 50-54.: 18.5 55-59.: 29.4 60-64.: 34.4 65-74.: 64.5 75-...: 111.4
А здесь война. Надо только правильно сообразить, как эти числа преобразовать, что бы можно было бы их сравнить. Думаю, видно не только детскую смертность, но и войну тоже.
Помнится, "Божіею поспѣшествующею милостію, Мы, NN, Императоръ и Самодержецъ Всероссійскій, Московскій, Кіевскій, Владимірскій, Новгородскій; Царь Казанскій, Царь Астраханскій, Царь Польскій, Царь Сибирскій, Царь Херсониса Таврическаго, Царь Грузинскій; Великій Князь Финляндскій, и прочая, и прочая, и прочая."
По губерниям нет под рукой, но по населению городов, Варшава - 3-я, Лодзь - 5-й, Рига - 6-я, Тифлис - 9-й, Вильно - 10-й, Ташкент - 11-й. ... (Баку, Кишинёв, Хельсинки, Коканд...)
Позиция понятна. Просто тогда, при сравнениях, Вам лучше всегда сравнивать показатель "ожидаемая продолжительность жизни от рождения".
Поскольку у "царских" статистиков Российской империи был практически самый "продвинутый" ("шапкозакидательский") детский учёт, их показатели всегда будут выглядеть существенно "хуже", чем у других.
Причём здесь царизм? Просто шведы, при монархизме, жили примерно аналогично, плюс/минус пятилетка развития здравоохранения, и всё.
Насчёт, до 60, ну не знаю. Судя по вашим реакциям, ожидаемая продолжительность жизни от рождения - 32,4 года в РИ 1897 года, у Вас вопросов не вызвало. Младенческая смертность 273 на 1000 на 1913 год РИ , тоже более менее соответствует вашим ожиданиям. Наверное, и смертность до года 132,5 на 1000 в РИ 1896-1897 годах, тоже без особых вопросов.
А ожидаемая продолжительность жизни 10 летнего ребёнка - 50,4 в РИ 1896-1897 годах, вызывает у Вас резкое неприятие. Но это ж, немного странно, как бы, 2×2 = 4.
P.S.
Как бы, понятно, что 10 летний ребёнок 1886 года рождения (т.е. живший в возрасте 10 лет на момент 1896-1897) попал бы на ваше кладбище с вероятностью ≈0.035, поэтому Вы их там и не видите.
Причём здесь лже-цифры? Тем более, что, насколько известно, "царские" статистики, по большей частью, придерживались левых взглядов и, как бы, ровно наоборот. К примеру, детей они учитывали чуть ли не с первого дня, в отличие от многих других статистиков, поэтому показатели ожидаемой продолжительности жизни от рождения были сравнительно неточными и сравнительно низкими.
Есть общепринятые статистики "ожидаемая продолжительность жизни (от рождения)", "ожидаемая продолжительность жизни от некоторого возраста", сравните их определения и то что Вы считаете. Это ж две большие разницы.
При этом, да, можно, конкретно по этому кладбищу, сравнивать разные годы. С некоторой натяжкой можно сравнить это кладбище с каким-нибудь другим кладбищем за тот же период.
Ваша статистика, без существенной доработки напильником и математикой, к показателю "Продолжительность жизни 10-летнего ребенка", рассчитанного шведами, не имеет отношения никаким боком, ни за какой год, ни за 1860, ни за 1916.
Как бы, да, если предположить, что хоронили всех, данные точны.
Но, средняя продолжительность жизни для людей родившихся после 1860 и умерших до 1916, очевидно, не равняется ни одной из стандартных общеупотребимых статистик, типа, "ожидаемая продолжительность жизни" и т.п. Её надо немного пересчитывать, или наоборот, проверять гипотезы о соответствии.
И да, как бы, большое упущение, что нет файла с результатами распознавания стандартных реквизитов (годы рождения/смерти, пол)
Такая статистика более надёжна, т.к. до внедрения стандартов ВОЗ в разных странах учёт детей очень сильно отличался (правда врачи и педиатры её не любят, во все времена).
В Российской Империи, по результатам переписи 1897 года (точнее 1896-1897), средний возраст дожития для 10 летнего - 50,4, если пересчитать по таблице смертности от С.А. Новосельского https://istmat.org/node/81
Ну а к концу столетия, на 1900, в РИ ~51 год для 10-летнего ребёнка, наверное, или немного больше. Но к 1916 году, ввиду войны, кто знает?
Достаточной информаци, в деле ожидаемой продолжительности жизни или возрастов дожития, ничто и никто не даёт. По любому, по своей природе - модельные параметры.
В случае Германии, с переписями раз в 5 лет, по надёжнее, для Российской империи (если вне Москвы и Санкт-Петербурга, для которых были ещё переписи) менее надёжно, но оценить можно. И такие оценки есть, просто их в ту Excel таблицу не внесли.
Хм, увы, там же данные до 1960 сильно неполны. К примеру, и в Германии, и в Российской империи/РСФСР/СССР проводились же переписи, но там нет их результатов.
Как бы, можно доверять большим учёным статистикам, т.е. переписям 1897 и 1920 годов, но если можно проверить, то почему нет?
Но и с научной точки зрения, перепись 1897 года до Первой мировой войны, а 1920 уже после Гражданской войны (точнее в её конце). А данные автора, как я понял, получаются уже в разгаре Первой мировой войны, но ещё до Великой Октябрьской революции. Так что, есть определённый интерес.
Хм, я точно не проверял, но на первый взгляд кажется, что до Glibc 2.34 (2021-08-01) это было бы непросто.
Строго говоря, есть свойства идеальной матрицы Вандермонда и свойства округлённой до заданной точности матрицы Вандермонда, и они отличаются. Отдельный вопрос - сетка, который тоже имеет много гититк, ну пусть останется равномерной:
Конечно же, есть. Во-первых, метод вычисления числа обусловленности выбран не самый точный, в NumPy есть быстрая функция
np.linalg.cond(matrix), а есть более точное разложениеnp.linalg.svd(matrix, compute_uv=False).Легко видеть, что число обусловленности идеальной матрицы Вандермонда неограниченно растёт по одному закону, округленной матрицы Вандермонда тоже растёт неограниченно, но по другому закону точка перегиба:
. Ну, а вычисленная оценка числа обусловленности ограничена точностью её вычисления.
Это да, точность входной матрицы влияет.
А в этом деле, тест с использованием
np.float32практически бесполезен, поскольку NumPy всё равно накапливает скалярное произведение наnp.float64.Я Вас умоляю...
Как бы, есть, только она всё равно от сетки зависит. Впрочем, для данной конкретной сетки, на графике и так всё видно.
Интересно, есть ли тому объяснение, что
precomit.shдолжен начинаться не с обычного шебанг#!, а с какого-нибудь непустого, к примеру, с эквивалента пустого шебанга:#!/usr/bin/env sh?Замечательно, после установки окружения по вашим рецептам, `cmake`/`ctest` отработали как положено со следующими ключами:
Все тесты собрались, в количестве, запустились, коды возврата и выдача проверилась, хорь, и это неплохо.
Прошу прощения, но режет глаз. Разрешите напомнить современное, более менее строгое, определение, параграф 13 раздел 6.10.1 Conditional inclusion, C23:
И так было всегда, например, параграф 6 (примерно) раздел 3.8.1 Conditional inclusion, C88 Third review X3J11 88-090 May 13 1988:
В первой редакции книги K&R, вроде как, это свойство забыли упомянуть, но аксакалы помнят, помнят, как работал их компилятор.
Правильно писать коротко и ясно:
Это как посмотреть, код
if (index < 0 || index >= forecast.Forecast.Count)проблемный - не работает сNaN, а если написатьif (0 <= index && index < forecast.Forecast.Count), то при работе по IEC 60559, всё будет корректно.А так, да, конечно, лучше, когда всё вместе, и интерфейс надёжный, и код надёжный. Хотя,
NaNможет просочиться и через интерфейс без деления, например, ввиду недостатка данных.Честно говоря, модель
Mail.Ru(Яндекс, и др.) не предусматривает такового "хранения", переустановка или новое устройство - новый ключ. А "хранение" - это лишнее, необязательное и небезопасное действие.Впрочем, если, лично Вам, оно нравится и у Вас есть специальный шифрблокнот для этого, почему нет?
Как что? Так сразу правительство. Берите выше.
Возрастные коэффициенты смертности мирных лет (1896-1897), смертей на 1000 данного возраста:
0.: 370.0 (от рождения до года)0-1.: 132.5 (от рождения до двух лет)
5-9.: 11.9
10-14.: 5.4
15-19.: 5.8
20-24.: 7.5
25-29.: 8.1
30-34.: 8.7
35-39.: 10.3
40-44.: 11.8
45-49.: 15.6
50-54.: 18.5
55-59.: 29.4
60-64.: 34.4
65-74.: 64.5
75-...: 111.4
А здесь война. Надо только правильно сообразить, как эти числа преобразовать, что бы можно было бы их сравнить. Думаю, видно не только детскую смертность, но и войну тоже.
Помнится, "Божіею поспѣшествующею милостію, Мы, NN, Императоръ и Самодержецъ Всероссійскій, Московскій, Кіевскій, Владимірскій, Новгородскій; Царь Казанскій, Царь Астраханскій, Царь Польскій, Царь Сибирскій, Царь Херсониса Таврическаго, Царь Грузинскій; Великій Князь Финляндскій, и прочая, и прочая, и прочая."
По губерниям нет под рукой, но по населению городов, Варшава - 3-я, Лодзь - 5-й, Рига - 6-я, Тифлис - 9-й, Вильно - 10-й, Ташкент - 11-й. ... (Баку, Кишинёв, Хельсинки, Коканд...)
Позиция понятна. Просто тогда, при сравнениях, Вам лучше всегда сравнивать показатель "ожидаемая продолжительность жизни от рождения".
Поскольку у "царских" статистиков Российской империи был практически самый "продвинутый" ("шапкозакидательский") детский учёт, их показатели всегда будут выглядеть существенно "хуже", чем у других.
Причём здесь царизм? Просто шведы, при монархизме, жили примерно аналогично, плюс/минус пятилетка развития здравоохранения, и всё.
Насчёт, до 60, ну не знаю. Судя по вашим реакциям, ожидаемая продолжительность жизни от рождения - 32,4 года в РИ 1897 года, у Вас вопросов не вызвало. Младенческая смертность 273 на 1000 на 1913 год РИ , тоже более менее соответствует вашим ожиданиям. Наверное, и смертность до года 132,5 на 1000 в РИ 1896-1897 годах, тоже без особых вопросов.
А ожидаемая продолжительность жизни 10 летнего ребёнка - 50,4 в РИ 1896-1897 годах, вызывает у Вас резкое неприятие. Но это ж, немного странно, как бы, 2×2 = 4.
P.S.
Как бы, понятно, что 10 летний ребёнок 1886 года рождения (т.е. живший в возрасте 10 лет на момент 1896-1897) попал бы на ваше кладбище с вероятностью ≈0.035, поэтому Вы их там и не видите.
Причём здесь лже-цифры? Тем более, что, насколько известно, "царские" статистики, по большей частью, придерживались левых взглядов и, как бы, ровно наоборот. К примеру, детей они учитывали чуть ли не с первого дня, в отличие от многих других статистиков, поэтому показатели ожидаемой продолжительности жизни от рождения были сравнительно неточными и сравнительно низкими.
Есть общепринятые статистики "ожидаемая продолжительность жизни (от рождения)", "ожидаемая продолжительность жизни от некоторого возраста", сравните их определения и то что Вы считаете. Это ж две большие разницы.
При этом, да, можно, конкретно по этому кладбищу, сравнивать разные годы. С некоторой натяжкой можно сравнить это кладбище с каким-нибудь другим кладбищем за тот же период.
Прошу прощения, но как Вы можете сравнивать?
Ваша статистика, без существенной доработки напильником и математикой, к показателю "Продолжительность жизни 10-летнего ребенка", рассчитанного шведами, не имеет отношения никаким боком, ни за какой год, ни за 1860, ни за 1916.
Как бы, да, если предположить, что хоронили всех, данные точны.
Но, средняя продолжительность жизни для людей родившихся после 1860 и умерших до 1916, очевидно, не равняется ни одной из стандартных общеупотребимых статистик, типа, "ожидаемая продолжительность жизни" и т.п. Её надо немного пересчитывать, или наоборот, проверять гипотезы о соответствии.
И да, как бы, большое упущение, что нет файла с результатами распознавания стандартных реквизитов (годы рождения/смерти, пол)
Такая статистика более надёжна, т.к. до внедрения стандартов ВОЗ в разных странах учёт детей очень сильно отличался (правда врачи и педиатры её не любят, во все времена).
В Российской Империи, по результатам переписи 1897 года (точнее 1896-1897), средний возраст дожития для 10 летнего - 50,4, если пересчитать по таблице смертности от С.А. Новосельского https://istmat.org/node/81
Ну а к концу столетия, на 1900, в РИ ~51 год для 10-летнего ребёнка, наверное, или немного больше. Но к 1916 году, ввиду войны, кто знает?
Достаточной информаци, в деле ожидаемой продолжительности жизни или возрастов дожития, ничто и никто не даёт. По любому, по своей природе - модельные параметры.
В случае Германии, с переписями раз в 5 лет, по надёжнее, для Российской империи (если вне Москвы и Санкт-Петербурга, для которых были ещё переписи) менее надёжно, но оценить можно. И такие оценки есть, просто их в ту Excel таблицу не внесли.
Хм, увы, там же данные до 1960 сильно неполны. К примеру, и в Германии, и в Российской империи/РСФСР/СССР проводились же переписи, но там нет их результатов.
А автор интересуется 1916 годом.
Как бы, можно доверять большим учёным статистикам, т.е. переписям 1897 и 1920 годов, но если можно проверить, то почему нет?
Но и с научной точки зрения, перепись 1897 года до Первой мировой войны, а 1920 уже после Гражданской войны (точнее в её конце). А данные автора, как я понял, получаются уже в разгаре Первой мировой войны, но ещё до Великой Октябрьской революции. Так что, есть определённый интерес.