Начну новую тему,т.к. в теме "ку" разбираются несколько иные вопросы.
Сплайны - они и в африке сплайны, метод конечных элементов также и в африке метод конечных элементов, и я верю, что весь набор программ Андрея Михайловича можно реализовать средствами Матлаба без написания дополнительных программ, надо только очень хорошо ориентироваться в его возможностях и одновременно понимать, что за математические объекты и методы вычислений мы на самом деле используем.
Сегодня речь пойдет о построении одномерной матрицы A. По существу, это вычисление значений B-сплайна третьей степени. Бэ, а не бета. От слова базисный. Андрей Михайлович ошибался. B-сплайн может быть любой степени, т.к. он абстрактно выводится например как преобразование Фурье функции (sin x/x)^p, где p - нужная степень B-сплайна+1. (см. Марчук, Агошков. Введение в проекционно-сеточные методы. 1981).
В матлабе, в spline toolbox, есть функция spcol, решающая задачу, аналогичную программам a0, a0_grd и их векторизованым вариантам (a0rc, a0_grdrc).
Только spcol более универсальна и позволяет работать с нерегулярными сетками и с B-сплайнами любой степени, не только третьей.
По матлабовской справке spcol генерирует "матрицу коллокации". О связи сплайн-коллокации и нашей возни я уже писал в "
Когда просто хочется что-то сказать".
Отличия spcol и a0 сводятся к следующему:
-a0 работает с "областью построения", а spcol - с координатами узлов, возможна и нерегулярная сетка. Поэтому нужно задавать координату каждого узла, т.е. подовать на вход программы вектор координат узлов.
-spcol может построить сплайн любой степени (средний параметр вызова). Для того, чтобы строился наш любимый кубический B-сплайн, нужно указать 4 (на единицу больше).
-вектор, генерируемый spcol (или матрица, если задано несколько точек), не содержит расширенной области. Если я укажу n узлов, программа построит вектор длиной n-m, где m - средний параметр (степень сплайна +1). a0 же, наоборот, построит вектор длиной n+2. Суммарная разница составит шесть шагов сетки для кубического сплайна.
-при увеличении степени b-сплайна в spcol он ползет (удлиняется) влево, т.е. например если для сплайна 1-й степени ненулевые значения были в 7-м и 6-м узле, то для сплайна 2-й степени - в 5-м, 6, 7-м, а для 3-й степени - в 4,5,6,7. Т.е. целая часть координаты точки отражает положение крайнего _правого_ полинома. В a0 наоборот целая часть координаты точки отражает положение крайнего _левого_ полинома. Поэтому для получения одинаковых результатов нужно к координатам узлов, прииемлемых для a0, прибавить m-1 единиц шага сетки.
Окончательно имеем:
вызову
a0rc([a b],x,h)
где x может быть как одно число, так и вектор чисел, соответствует:
spcol([a:h:b+6*h],4,x+3*h])
здесь 4-ка определяет степень сплайна+1, а цифры 3 и 6 возникают из-за различия в нумерации узлов в a0 и spcol и того, что spcol не делает расширения области. В более общем виде, для сплайна степени m-1 можно записать:
spcol([a:h:b+(m+2)*h],m,x+(m-1)*h)
но это выражение верно только тогда, когда расширенная область для других степеней задается так же, как для третьей (как на самом деле - не знаю).
Вызову a0rc_grd, генерирующую массив значений сплайнов без нулей при выполнении визуализации, соответствует:
spcol([1:1:8],4,[0:(1/dd):1-(1/dd)]+4),
где dd - коэффициент сгущения. Или для сплайна произвольной степени m-1
spocl([1:1:2m],m,[0:(1/dd):1-(1/dd)]+m)
Ту же самую программу spcol, естественно, можно применить и для B-сплайнов первой степени (функций-крышек). Средний параметр будет 2.