Текст урока с работающими фрагментами расчетов в файле uroki-approksimacii.xls
Следующая задача: аппроксимация табличной функции в диапазоне давлений 160--200 кгс/см2.
В этом случае (см. файл Уроки аппроксимации.xls, Лист3) мы использовали полином классического вида:
i"nas=a+b1*P+b2*P^2+b3*P^3
Табличные данные обрабатывались расположенной справа от массива данных функцией Линейн. Как и ранее, аппроксимировались два варианта данных. По первому варианту значение среднего квадратичного отклонения i"nas от линии аппроксимации получилось 0.12 ккал/кг при максимальном отклонении 0.09 ккал/кг. Здесь проявилась еще одна важная проблема аппроксимации функций и вообще любого рода обработки данных. Дело в том, что полиномы - это в определенном смысле небезопасная вещь. Он может точно пройти по обрабатываемым точкам, но в промежутках между ними давать совершенно неприемлемый результат. Опасность усугубляется тем, что у нас всего лишь 6 обрабатываемых точек при полиноме третьей степени и, соответственно, всего лишь одна степень свободы - 2-я колонка, 4-я строка массива Линейн. В связи с этим "умная" программа увеличила оценку среднеквадратичного отклонения. Проблема эта решается сравнением результатов аппроксимации с табличными данными в промежуточных точках. Мы это проделали и максимальное отклонение аппроксимируемой функции от аппроксимируеющей действительно не превысило 0.09 ккал/кг. Это связано с тем, что аппроксимируемый диапазон в относительных единицах невелик: (200-160)/160=0.25. В таком относительно узком диапазоне полиному "трудно" рисовать синусоидальные точки, поэтому в данном случае полином сработал вполне корректно.
По второму варианту программа Линейн "пообещала" среднеквадратичное отколонение 0.02 ккал/кг при максимальном отклонении 0.01 ккал/кг. Однако по промежуточным точкам получили максимальное отклонение в единичной точке порядка 0.04 ккал/кг. По одной точке сложно судить о причине отклонения - она может быть и из-за смещения аппроксимации и из-за ошибки округления в исходных данных или из-за сочетания этих причин, поэтому мы не стали корректировать этот полином:
i"nas=1328.53-11.74477*P+0.06822061*P^2-0.0001407861*P^3
Следующая проблема аппроксимации функции - объединение аппроксимируемых диапазонов. В точке стыковки (163.2 кгс/см2) не должно быть скачка значений и резкого изменения характера производных.
Проводим проверку первого и второго полиномов:
В окресности точки стыковки они дают практически одинаковый результат. Следовательно оба полинома можно оставить без дальнейшей их корректировки. Теперь уже осталась относительно несложная проблема в части аппроксимации функций: объединение аппроксимирующих фрагментов в одну общую формулу. Результат объединения на листе Excel и в Visual Basic выглядит следующим образом:
на листе Excel:
i"nas=Если(P<163.2;557.67+146.6978*P^0.2-141.0949*P^0.4+130.3459*P^0.6-73.5387*P^0.8+21.45838*P-2.660653*P^1.2-0.09513217*(P/100)^7;1328.53-11.74477*P+0.06822061*P^2-0.0001407861*P^3)
в Visual Basic:
i"nas=iif(P<163.2,557.67+146.6978*P^0.2-141.0949*P^0.4+130.3459*P^0.6-73.5387*P^0.8+21.45838*P-2.660653*P^1.2-0.09513217*(P/100)^7,1328.53-11.74477*P+0.06822061*P^2-0.0001407861*P^3)
Однако одна из проблем аппроксимации функции i"nas так и осталась не выясненной до конца - это качество аппроксимации в диапазоне 163--204 кгс/кг. Подозрительно точное совпадение расчетов по полиному с аппроксимируемыми данными говорит о том, что скорее всего имело место воспроизведение полиномом ошибок округления в таблично заданной фукции i"nas. Пришлось более детально исследовать этот диапазон:
Максимальная ошибка аппроксимации фукции i"nas оказалась относительно небольшой - 0.04 ккал/кг или, возможно, даже меньше, потому что в расчетное отклонение может входить и ошибка округления фукции i"nas. Но лучше все же, чтобы наша аппроксимация имела более корректный, не синусоидальный, вид. Здесь возникают два варианта возможной коррекции аппроксимации фукции i"nas:
- введение поправки в расчет аппроксимации;
- замена формулы аппроксимации или ее отдельной части.
Каждый из вариантов может иметь свои преимущества и недостатки. В данном случае, поправка невелика, но она имеет сложный вид. Если мы ее выразим аналитически, то рискуем просто воспроизвести ошибку округления таблично заданной фукции i"nas, а назначение аппроксимации не вопроизводить ошибки, а выравнивать (то есть, устранять) их.
Мы исследовали разные варианты аппроксимации фукции i"nas в диазоне 163--204 кгс/см2 с подробно выписанными данными из исходной таблицы. Получили примерно следующий вариант (примерно потому, что разные варианты дали похожие, но все же не одинаковые результаты):
Справа мы повторили предыдущий вариант. Как видим, максимальное отклонение аппроксимации от табличных данных уменьшилось лишь на 0.01 ккал/кг. Остаточное отклонение в пределах 0.03 ккал/кг следует отнести к ошибкам округления, а не к ошибке аппроксимации таблично заданной фукции i"nas. Уточнение аппроксимации на 0.01 ккал/кг является несущественным. Таким образом, по результатам проведенного исследования аппроксимации фукции i"nas оставляем прежнюю формулу для аппроксимации этой функции в диапазоне 0.01-203 кгс/кг:
на листе Excel:
i"nas=Если(P<163.2;557.67+146.6978*P^0.2-141.0949*P^0.4+130.3459*P^0.6-73.5387*P^0.8+21.45838*P-2.660653*P^1.2-0.09513217*(P/100)^7;1328.53-11.74477*P+0.06822061*P^2-0.0001407861*P^3)
в Visual Basic:
i"nas=iif(P<163.2,557.67+146.6978*P^0.2-141.0949*P^0.4+130.3459*P^0.6-73.5387*P^0.8+21.45838*P-2.660653*P^1.2-0.09513217*(P/100)^7,1328.53-11.74477*P+0.06822061*P^2-0.0001407861*P^3)
Однако, ради объективности, мы должны попытаться уточнить еще один момент. До сих пор мы говорили об ошибках округления. Но явно воспроизводящийся при различных проведенных аппроксимациях характер синусоидальных отклонений от линии аппроксимации функции, говорит о том, что эти "синусоиды" присутствуют в исходной таблице наряду с оговоренными выше погрешностями округлений. Мы сгладили эти отклонения и округления и вряд ли есть целесообразность в том, чтобы пытаться их воспроизводить "уточнением" полученного выше полинома.