2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Кто-нибудь имел дело с БЧА МГУ, Подпрограмма: IAC1R?
Сообщение03.07.2017, 15:48 
Кто-нибудь имел дело с БЧА МГУ, Подпрограмма: IAC1R? ( http://num-anal.srcc.msu.ru/lib_na/cat/i/iac1r.htm )
"Вычисление сетки и коэффициентов аппроксимирующего кубического сплайна по заданным значениям функции одной переменной и краевым условиям на заданной (возможно неравномерной) сетке."

SUBROUTINE IAC1R (X, NX, FX, LX, MXA, FXA, MXB, FXB, TX, CX)

Можете НА ПАЛЬЦАХ объяснить смысл 4-го аргумента LX ? ("LX - заданное число, порядок аппроксимирующих формул, 0 ≤ LX ≤ 1")

В описании есть ссылка на "Гребенников А.И. Метод сплайнов и решение некоррректных задач теории приближений. M.: Изд - во МГУ, 1983"
Две недели ушло на поиски этого манускрипта. А там 200 стр. убористых формул и терминов таких нет. Это еще минимум две недели на копание и не факт. Нет, чтобы по людски инструкции писать, если уж подпрограмму предлагаешь.

Спасибо.

 
 
 
 Re: Кто-нибудь имел дело с БЧА МГУ, Подпрограмма: IAC1R?
Сообщение03.07.2017, 17:58 
Аватара пользователя
Посмотрел текст программы и на Фортране, и на C, и на Паскале. Во всех вариантах порядок аппроксимации LX — целочисленный параметр (как и большинство «порядков»). Тогда $0\leqslant $ LX $\leqslant 1$ непонятно.

 
 
 
 Re: Кто-нибудь имел дело с БЧА МГУ, Подпрограмма: IAC1R?
Сообщение03.07.2017, 20:03 
svv

"Тогда $0\leqslant $ LX $\leqslant 1$ непонятно."

По тексту этой подпрограммы и её внутренних - LX = 0 / 1. Проблема - когда и для чего LX=0 и LX=1 ?

 
 
 
 Re: Кто-нибудь имел дело с БЧА МГУ, Подпрограмма: IAC1R?
Сообщение03.07.2017, 21:54 
Аватара пользователя
Взял для примера подпрограмму IAC1R1 на C и постарался, не меняя алгоритм, упростить её как можно больше. Например, выбросил операторы, обеспечивающие совместимость индексов с фортрановской нумерацией. Так, чтобы можно было легко увидеть, что, собственно, там делается. Вот что получилось.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
double iac1r1_c(double *t, double *c, int lx, int j)
{
   if (lx==0)
      return c[j];
   if (lx==1)
   {
      double
         p = t[j+1] - t[j-1],
         q = t[j+1] - t[j  ],
         r = t[j  ] - t[j-1];
      return (p*p/(q*r) * c[j] - q*q/(r*p) * c[j-1] - r*r/(q*p) * c[j+1]) / 3.;
   }
   if (lx>1)
      return (438*c[j] - 112*(c[j-1] + c[j+1]) + 13*(c[j-2] + c[j+2])) / 240.;
}
 

Там есть ветвь, которая при LX $\in\{0,1\}$ вообще никогда не должна выполняться. И такое впечатление, что три ветви, соответствующие LX=0, LX=1 и LX>1, реализуют три совершенно разных подхода.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group