<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94500</guid>
        <pubDate>Wed, 09 Oct 2002 10:35:04 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94500</link>
        <description><![CDATA[сергей: а можно то же самое (на си) для функции 3-х переменных?<br>заранее благодарен....<br>]]></description>
        <author>сергей</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94499</guid>
        <pubDate>Thu, 04 Jul 2002 08:38:39 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94499</link>
        <description><![CDATA[murph: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">/* spline.h</div><div class="code_line">*/</div><div class="code_line">#ifndef __SPLINE_H</div><div class="code_line">&nbsp;</div><div class="code_line">double *spline (int n, double *x, double *y, double *c);</div><div class="code_line">double *splcvt (int n, double *x, double *y, double *c);</div><div class="code_line">double  seval  (int n, double z, double *x, double *y, double *c);</div><div class="code_line">double  seval1 (int n, double z, double *x, double *y, double *c);</div><div class="code_line">&nbsp;</div><div class="code_line">#define __SPLINE_H</div><div class="code_line">#endif /* __SPLINE_H */</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">/* spline.c</div><div class="code_line">*/</div><div class="code_line">#include &#60;float.h&#62;</div><div class="code_line">#include &#60;stddef.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;spline.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">#define TOL        (2.0*DBL_MIN/DBL_EPSILON)</div><div class="code_line">#define square(x)  ((x)*(x))</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">double *spline (int n, double x[], double y[], double c[])</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Вычисление коэффициентов кубического интерполяционного сплайна,</div><div class="code_line">&nbsp;* записанного в виде:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* S(x) = w(i)*y(i+1) + w&#39;(i)*y(i) +</div><div class="code_line">&nbsp;*        h(i)^2 * ((w(i)^3 - w(i))*c(i+1) + (w&#39;(i)^3 - w&#39;(i))*c(i)),</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* где h(i)  = x(i+1) - x(i),</div><div class="code_line">&nbsp;*     w(i)  = (x - x(i)) / h(i),</div><div class="code_line">&nbsp;*     w&#39;(i) = 1 - w(i).</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Аргументы:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* n - число заданных точек (узлов) (n &#62;= 2),</div><div class="code_line">&nbsp;* x - массив абсцисс узлов в строго возрастающем порядке,</div><div class="code_line">&nbsp;* y - массив ординат узлов,</div><div class="code_line">&nbsp;* c - рабочий массив размером не менее 3*n элементов типа double.</div><div class="code_line">&nbsp;*     После возврата из функции spline в первых n элементах этого</div><div class="code_line">&nbsp;*     массива находятся коэффициенты сплайна c(i).</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Возвращаемое значение:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Указатель на массив вычисленных коэффициентов c[] либо NULL, если</div><div class="code_line">&nbsp;* построить сплайн невозможно (n &#60; 2, абсциссы узлов не упорядочены</div><div class="code_line">&nbsp;* либо среди них имеются совпадающие значения).</div><div class="code_line">*/</div><div class="code_line">{</div><div class="code_line">&nbsp;  double *b = c + n;</div><div class="code_line">&nbsp;  double *d = b + n;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  double t;</div><div class="code_line">&nbsp;  int i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (n &#60; 2)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     return NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  else if (n == 2)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     c[1] = c[0] = 0.0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  else  {</div><div class="code_line">&nbsp;     /* Формирование трехдиагональной системы линейных уравнений.</div><div class="code_line">&nbsp;        b = диагональ, d = наддиагональ, c = правые части.</div><div class="code_line">&nbsp;     */</div><div class="code_line">&nbsp;     for (i = 0; i &#60; n-1; i++) {</div><div class="code_line">&nbsp;        if ((d[i] = x[i+1] - x[i]) &#60;= TOL) return (NULL);</div><div class="code_line">&nbsp;        c[i+1] = (y[i+1] - y[i]) / d[i];</div><div class="code_line">&nbsp;        if (i) {</div><div class="code_line">&nbsp;           c[i] = c[i+1] - c[i];</div><div class="code_line">&nbsp;           b[i] = 2.0 * (d[i-1] + d[i]);</div><div class="code_line">&nbsp;        }</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;     /* Граничные условия. Третьи производные в точках x[0] и x[n-1]</div><div class="code_line">&nbsp;        вычисляются с помощью разделенных разностей.</div><div class="code_line">&nbsp;     */</div><div class="code_line">&nbsp;     b[0] = -d[0];</div><div class="code_line">&nbsp;     b[n-1] = -d[n-2];</div><div class="code_line">&nbsp;     if (n == 3)</div><div class="code_line">&nbsp;        c[0] = c[n-1] = 0.0;</div><div class="code_line">&nbsp;     else {</div><div class="code_line">&nbsp;        c[0]   = c[2]/(x[3]-x[1]) - c[1]/(x[2]-x[0]);</div><div class="code_line">&nbsp;        c[n-1] = c[n-2]/(x[n-1]-x[n-3]) - c[n-3]/(x[n-2]-x[n-4]);</div><div class="code_line">&nbsp;        c[0]  *= square(d[0]) / (x[3]-x[0]);</div><div class="code_line">&nbsp;        c[n-1] = -(c[n-1]*square(d[n-2]) / (x[n-1]-x[n-4]));</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     /* Прямой ход метода Гаусса */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     for (i = 0; i &#60; n-1; i++) {</div><div class="code_line">&nbsp;        t = d[i] / b[i];</div><div class="code_line">&nbsp;        b[i+1] -= t*d[i];</div><div class="code_line">&nbsp;        c[i+1] -= t*c[i];</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     /* Обратная подстановка */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     c[n-1] /= b[n-1];</div><div class="code_line">&nbsp;     for (i = n-2; i &#62;= 0; i--)</div><div class="code_line">&nbsp;        c[i] = (c[i] - d[i]*c[i+1]) / b[i];</div><div class="code_line">&nbsp;  }</div><div class="code_line">&nbsp;  return c;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">/* splcvt.c</div><div class="code_line">*/</div><div class="code_line">#include &#60;stddef.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;spline.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">double *splcvt (int n, double x[], double y[], double c[])</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Преобразование сплайна, построенного с помощью функции spline,</div><div class="code_line">&nbsp;* к виду</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* S(x) = y[i] + b[i]*(x-x[i]) + c[i]*(x-x[i])^2 + d[i]*(x-x[i])^3</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* где x[i] &#60;= x &#60;= x[i+1].</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Аргументы:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* n - число заданных точек (узлов) (n &#62;= 2),</div><div class="code_line">&nbsp;* x - массив абсцисс узлов в строго возрастающем порядке,</div><div class="code_line">&nbsp;* y - массив ординат узлов,</div><div class="code_line">&nbsp;* c - массив размером не менее 3*n элементов типа double.</div><div class="code_line">&nbsp;*     В первых n элементах этого массива должны находиться коэффициенты</div><div class="code_line">&nbsp;*     сплайна, рассчитанные функцией spline. После вызова splcvt массив</div><div class="code_line">&nbsp;*     содержит результат преобразования, т.е. коэффициенты b[i], c[i], d[i]</div><div class="code_line">&nbsp;*     в следующем порядке:</div><div class="code_line">&nbsp;*     - первые n элементов массива: коэффициенты c[i],</div><div class="code_line">&nbsp;*     - следующие n элементов:      коэффициенты b[i],</div><div class="code_line">&nbsp;*     - последние n элементов:      коэффициенты d[i].</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Возвращаемое значение:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Указатель на массив вычисленных коэффициентов c[] либо NULL, если</div><div class="code_line">&nbsp;* построить сплайн невозможно (n &#60; 2).</div><div class="code_line">*/</div><div class="code_line">{</div><div class="code_line">&nbsp;  double *b = c + n;</div><div class="code_line">&nbsp;  double *d = b + n;</div><div class="code_line">&nbsp;  int i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (n &#60; 2)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     return NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  else if (n == 2) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     b[1] = b[0] = (y[1] - y[0]) / (x[1] - x[0]);</div><div class="code_line">&nbsp;     d[1] = d[0] = 0.0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  }</div><div class="code_line">&nbsp;  else {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     for (i = 0; i &#60; n-1; i++) {</div><div class="code_line">&nbsp;        d[i] = x[i+1] - x[i];</div><div class="code_line">&nbsp;        b[i] = (y[i+1] - y[i]) / d[i];</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     b[n-1] = b[n-2] + d[n-2] * (c[n-2] + 2.0*c[n-1]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     for (i = 0; i &#60; n-1; i++) {</div><div class="code_line">&nbsp;        b[i] -= d[i] * (c[i+1] + 2.0*c[i]);</div><div class="code_line">&nbsp;        d[i] = (c[i+1] - c[i]) / d[i];</div><div class="code_line">&nbsp;        c[i] *= 3.0;</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;     d[n-1] = d[n-2];</div><div class="code_line">&nbsp;     c[n-1] *= 3.0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  }</div><div class="code_line">&nbsp;  return c;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">/* seval1.c</div><div class="code_line">*/</div><div class="code_line">#include &quot;spline.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">double seval1 (int n, double z, double x[], double y[], double c[])</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Значение кубического сплайна в заданной точке.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* S(z) = y(i) + b(i)*(z-x(i)) + c(i)*(z-x(i))^2 + d(i)*(z-x(i))^3</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Номер интервала i выбирается таким образом, чтобы для значений z,</div><div class="code_line">&nbsp;* лежащих внутри диапазона табличных абсцисс, выполнялось условие:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;*     x(i) &#60;= z &#60;= x(i+1).</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Если z &#60; x(0), берется i = 0; если z &#62;= x(n-1), берется i = n-1.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Если по сравнению с предыдущим вызовом seval значение z не находится</div><div class="code_line">&nbsp;* в том же интервале [x(i), x(i+1)], тo для отыскания нужного интервала</div><div class="code_line">&nbsp;* применяется двоичный поиск.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Аргументы:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* n - число заданных точек (узлов) (n &#62;= 2),</div><div class="code_line">&nbsp;* z - абсцисса, для которой вычисляется значение сплайна,</div><div class="code_line">&nbsp;* x - массив абсцисс узлов в строго возрастающем порядке,</div><div class="code_line">&nbsp;* y - массив ординат узлов,</div><div class="code_line">&nbsp;* c - массив коэффициентов сплайна, рассчитанных функцией splcvt.</div><div class="code_line">*/</div><div class="code_line">{</div><div class="code_line">&nbsp;  static int i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  double *b = c + n;</div><div class="code_line">&nbsp;  double *d = b + n;</div><div class="code_line">&nbsp;  double dx;</div><div class="code_line">&nbsp;  int j, k;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (i &#62;= n-1) i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  /* Двоичный поиск */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (z &#60; x[i] || z &#62; x[i+1]) {</div><div class="code_line">&nbsp;     i = 0;</div><div class="code_line">&nbsp;     j = n;</div><div class="code_line">&nbsp;     while (j &#62; i+1) {</div><div class="code_line">&nbsp;        k = (i+j)/2;</div><div class="code_line">&nbsp;        if (z &#60; x[k])</div><div class="code_line">&nbsp;           j = k;</div><div class="code_line">&nbsp;        else</div><div class="code_line">&nbsp;           i = k;</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;  }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  /* Вычисление сплайна */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  dx = z - x[i];</div><div class="code_line">&nbsp;  return (y[i] + dx*(b[i] + dx*(c[i] + dx*d[i])));</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">/* seval.c</div><div class="code_line">*/</div><div class="code_line">#include &quot;spline.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">#define square(x)  ((x)*(x))</div><div class="code_line">&nbsp;</div><div class="code_line">double seval (int n, double z, double x[], double y[], double c[])</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Значение кубического сплайна в заданной точке.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* S(z) = w(i)*y(i+1) + w&#39;(i)*y(i) +</div><div class="code_line">&nbsp;*        h(i)^2 * ((w(i)^3 - w(i))*c(i+1) + (w&#39;(i)^3 - w&#39;(i))*c(i)),</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* где h(i)  = x(i+1) - x(i),</div><div class="code_line">&nbsp;*     w(i)  = (z - x(i)) / h(i),</div><div class="code_line">&nbsp;*     w&#39;(i) = 1 - w(i).</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Номер интервала i выбирается таким образом, чтобы для значений z,</div><div class="code_line">&nbsp;* лежащих внутри диапазона табличных абсцисс, выполнялось условие:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;*     x(i) &#60;= z &#60;= x(i+1).</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Если z &#60; x(0), берется i = 0; если z &#62; x(n-1), берется i = n-2.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Если по сравнению с предыдущим вызовом seval значение z не находится</div><div class="code_line">&nbsp;* в том же интервале [x(i), x(i+1)], тo для отыскания нужного интервала</div><div class="code_line">&nbsp;* применяется двоичный поиск.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Аргументы:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* n - число заданных точек (узлов) (n &#62;= 2),</div><div class="code_line">&nbsp;* z - абсцисса, для которой вычисляется значение сплайна,</div><div class="code_line">&nbsp;* x - массив абсцисс узлов в строго возрастающем порядке,</div><div class="code_line">&nbsp;* y - массив ординат узлов,</div><div class="code_line">&nbsp;* c - массив коэффициентов сплайна, рассчитанных функцией spline.</div><div class="code_line">*/</div><div class="code_line">{</div><div class="code_line">&nbsp;  static int i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  double h, w, w1;</div><div class="code_line">&nbsp;  int j, k;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (i &#62;= n-1) i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  /* Двоичный поиск */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (z &#60; x[i] || z &#62; x[i+1]) {</div><div class="code_line">&nbsp;     i = 0;</div><div class="code_line">&nbsp;     j = n-1;</div><div class="code_line">&nbsp;     while (j &#62; i+1) {</div><div class="code_line">&nbsp;        k = (i+j)/2;</div><div class="code_line">&nbsp;        if (z &#60; x[k])</div><div class="code_line">&nbsp;           j = k;</div><div class="code_line">&nbsp;        else</div><div class="code_line">&nbsp;           i = k;</div><div class="code_line">&nbsp;     }</div><div class="code_line">&nbsp;  }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  /* Вычисление сплайна */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  h = x[i+1] - x[i];</div><div class="code_line">&nbsp;  w1 = 1.0 - (w = (z-x[i])/h);</div><div class="code_line">&nbsp;  return (w*y[i+1] + w1*y[i] +</div><div class="code_line">&nbsp;          square(h) * (w*(square(w)-1.0)*c[i+1] + w1*(square(w1)-1.0)*c[i]));</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>murph</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94498</guid>
        <pubDate>Thu, 04 Jul 2002 07:53:21 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94498</link>
        <description><![CDATA[the_moon: Да! да! на Си пожалуйста.<br><br>]]></description>
        <author>the_moon</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94497</guid>
        <pubDate>Thu, 04 Jul 2002 06:53:53 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94497</link>
        <description><![CDATA[murph: Это на паскале. Могу и на C.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">{====================}  UNIT SplinUNT; {======================}</div><div class="code_line">&nbsp;</div><div class="code_line">{  В этот модуль включены подпрограммы SPLINE и SEVAL из книги</div><div class="code_line">Форсайт Дж., Малькольм М., Моулер К., Машинные методы математи-</div><div class="code_line">ческих вычислений: Пер. с анг.- М.: Мир, 1980. с. 91-94.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  Для повышения точности интерполяции используется арифметика</div><div class="code_line">с плавающей точкой, определяемая типом</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;                   RealType = double</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  Если Ваш компьютер не имеет арифметического сопроцессора, и</div><div class="code_line">Вы хотите несколько увеличить  скорость вычислений ценой  ухуд-</div><div class="code_line">шения точности, а также во всех других случаях, когда необходи-</div><div class="code_line">мо сменить базовый вещественный тип (например, в целях экономии</div><div class="code_line">памяти), Вы должны желаемым образом изменить определение вещес-</div><div class="code_line">твенного типа, например: type RealType = real;</div><div class="code_line">}</div><div class="code_line">{-------------------------------------------------------------}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;                        INTERFACE</div><div class="code_line">{$N+,E+}</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;  RealType = double;              { базовый вещественный тип }</div><div class="code_line">&nbsp;  RealTypeArray =</div><div class="code_line">&nbsp;     array [1..(2*MaxInt) div Sizeof(RealType)] of RealType;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Spline (N : word; var XI, YI, BI, CI, DI);</div><div class="code_line">{</div><div class="code_line">&nbsp;  Вычисляются коэффициенты B[i], C[i] и D[i], i = 1..N</div><div class="code_line">&nbsp;  для кубического интерполяционного сплайна вида</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  S(X) = Y[i]+B[i]*(X-X[i])+C[i]*(X-X[i])**2+D[i]*(X-X[i])**3</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  для X[i] &#60;= X &#60;= X[i+1].</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  ВХОДНАЯ ИНФОРМАЦИЯ:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  N - число заданных точек или узлов (N &#62;= 2);</div><div class="code_line">&nbsp;  X - абсциссы узлов в строго возрастающем порядке ;</div><div class="code_line">&nbsp;  Y - ординаты узлов.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  ВЫХОДНАЯ ИНФОРМАЦИЯ:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  B, C, D, - массивы коэффициентов сплайна, записанного в указанной</div><div class="code_line">&nbsp;             выше форме.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  Если обозначить дифференцирование символом &#39;, то</div><div class="code_line">&nbsp;  Y[i] = S(X[i]);</div><div class="code_line">&nbsp;  B[i] = S&#39;(X[i]);</div><div class="code_line">&nbsp;  C[i] = S&#39;&#39;(X[i])/2;</div><div class="code_line">&nbsp;  D[i] = S&#39;&#39;&#39;(X[i])/6  (правосторонняя производная).</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  С помощью сопровождающей функции SEVAL можно вычислять значения</div><div class="code_line">&nbsp;  сплайна.</div><div class="code_line">}</div><div class="code_line">{-------------------------------------------------------------}</div><div class="code_line">&nbsp;</div><div class="code_line">function Seval (N : word; var U : RealType;</div><div class="code_line">&nbsp;               var XI, YI, BI, CI, DI) : RealType;</div><div class="code_line">{</div><div class="code_line">&nbsp;  Эта функция вычисляет значение кубического сплайна:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  Seval = Y[i]+B[i]*(U-X[i])+C[i]*(U-X[i])**2+D[i]*(U-X[i])**3</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  где X[i] &#60;= U &#60;= X[i+1]. Используется схема Горнера.</div><div class="code_line">&nbsp;  Если U &#60; X[1], то берется значение i = 1;</div><div class="code_line">&nbsp;  если U &#62; X[N], то i = N.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  ВХОДНАЯ ИНФОРМАЦИЯ:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  N - число заданных точек (N &#62;= 2);</div><div class="code_line">&nbsp;  U - абсцисса, для которой вычисляется значение сплайна;</div><div class="code_line">&nbsp;  X, Y - массивы заданных абсцисс и ординат;</div><div class="code_line">&nbsp;  B, C, D - массивы коэффициентов сплайна, вычисленные</div><div class="code_line">&nbsp;            процедурой Spline.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  Если по сравнению с предыдущим вызовом Seval значение U не</div><div class="code_line">&nbsp;  находится в том же интервале, то для отыскания нужного ин-</div><div class="code_line">&nbsp;  тервала используется двоичный поиск.</div><div class="code_line">}</div><div class="code_line">{-------------------------------------------------------------}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;                    IMPLEMENTATION</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Spline (N : word; var XI, YI, BI, CI, DI);</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;  X : RealTypeArray absolute XI;</div><div class="code_line">&nbsp;  Y : RealTypeArray absolute YI;</div><div class="code_line">&nbsp;  B : RealTypeArray absolute BI;</div><div class="code_line">&nbsp;  C : RealTypeArray absolute CI;</div><div class="code_line">&nbsp;  D : RealTypeArray absolute DI;</div><div class="code_line">&nbsp;  T : RealType;</div><div class="code_line">&nbsp;  i : integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin { Spline }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if N &#60; 2 then Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if N = 2 then begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     B[1] := (Y[2] - Y[1]) / (X[2] - X[1]);</div><div class="code_line">&nbsp;     C[1] := 0;</div><div class="code_line">&nbsp;     D[1] := 0;</div><div class="code_line">&nbsp;     B[2] := B[1];</div><div class="code_line">&nbsp;     C[2] := 0;</div><div class="code_line">&nbsp;     D[2] := 0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  end</div><div class="code_line">&nbsp;  else begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { Формирование трехдиагональной системы линейных уравнений:</div><div class="code_line">&nbsp;     B = диагональ, D = наддиагональ, C = правые части. }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     D[1] := X[2] - X[1];</div><div class="code_line">&nbsp;     C[2] := (Y[2] - Y[1]) / D[1];</div><div class="code_line">&nbsp;     for i := 2 to N-1 do begin</div><div class="code_line">&nbsp;        D[i] := X[i+1] - X[i];</div><div class="code_line">&nbsp;        B[i] := 2 * (D[i-1] + D[i]);</div><div class="code_line">&nbsp;        C[i+1] := (Y[i+1] - Y[i]) / D[i];</div><div class="code_line">&nbsp;        C[i] := C[i+1] - C[i]</div><div class="code_line">&nbsp;     end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { Граничные условия. Третьи производные в точках X[1] и X[N]</div><div class="code_line">&nbsp;     оцениваются с помощью разделенных разностей. }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     B[1] := -D[1];</div><div class="code_line">&nbsp;     B[N] := -D[N-1];</div><div class="code_line">&nbsp;     if N = 3 then begin</div><div class="code_line">&nbsp;        C[1] := 0;</div><div class="code_line">&nbsp;        C[N] := 0</div><div class="code_line">&nbsp;     end</div><div class="code_line">&nbsp;     else begin</div><div class="code_line">&nbsp;        C[1] := C[3]/(X[4]-X[2]) - C[2]/(X[3]-X[1]);</div><div class="code_line">&nbsp;        C[N] := C[N-1]/(X[N]-X[N-2]) - C[N-2]/(X[N-1]-X[N-3]);</div><div class="code_line">&nbsp;        C[1] :=  C[1] * sqr(D[1])/(X[4]-X[1]);</div><div class="code_line">&nbsp;        C[N] := -C[N] * sqr(D[N-1])/(X[N]-X[N-3])</div><div class="code_line">&nbsp;     end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { Прямой ход метода Гаусса }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     for i := 2 to N do begin</div><div class="code_line">&nbsp;        T := D[i-1]/B[i-1];</div><div class="code_line">&nbsp;        B[i] := B[i] - T*D[i-1];</div><div class="code_line">&nbsp;        C[i] := C[i] - T*C[i-1]</div><div class="code_line">&nbsp;     end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { Обратная подстановка }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     C[N] := C[N]/B[N];</div><div class="code_line">&nbsp;     for i := N-1 downto 1 do C[i] := (C[i] - D[i]*C[i+1]) / B[i];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { В C[i] теперь хранится значение Sigma(i), определяемое в книге:</div><div class="code_line">&nbsp;     Дж.Форсайт, М.Малькольм, К.Моулер, Машинные методы математических</div><div class="code_line">&nbsp;     вычислений. }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   { Вычисление коэффициентов сплайна B, C и D }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;     B[N] := (Y[N]-Y[N-1])/D[N-1] + D[N-1]*(C[N-1]+2*C[N]);</div><div class="code_line">&nbsp;     for i := 1 to N-1 do begin</div><div class="code_line">&nbsp;        B[i] := (Y[i+1]-Y[i])/D[i] - D[i]*(C[i+1]+2*C[i]);</div><div class="code_line">&nbsp;        D[i] := (C[i+1]-C[i])/D[i];</div><div class="code_line">&nbsp;        C[i] := 3*C[i]</div><div class="code_line">&nbsp;     end;</div><div class="code_line">&nbsp;     C[N] := 3*C[N];</div><div class="code_line">&nbsp;     D[N] := D[N-1]</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  end { N &#60;&#62; 2 };</div><div class="code_line">&nbsp;</div><div class="code_line">end { Spline };</div><div class="code_line">&nbsp;</div><div class="code_line">{-------------------------------------------------------------}</div><div class="code_line">&nbsp;</div><div class="code_line">function Seval (N : word; var U : RealType;</div><div class="code_line">&nbsp;               var XI, YI, BI, CI, DI) : RealType;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;  X : RealTypeArray absolute XI;</div><div class="code_line">&nbsp;  Y : RealTypeArray absolute YI;</div><div class="code_line">&nbsp;  B : RealTypeArray absolute BI;</div><div class="code_line">&nbsp;  C : RealTypeArray absolute CI;</div><div class="code_line">&nbsp;  D : RealTypeArray absolute DI;</div><div class="code_line">&nbsp;  DX : RealType;</div><div class="code_line">&nbsp;  j, k : integer;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;  i : integer = 1;</div><div class="code_line">&nbsp;</div><div class="code_line">begin { Seval }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if i &#62;= N then i := 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  if (U &#60; X[i]) or (U &#62; X[i+1]) then begin { Двоичный поиск }</div><div class="code_line">&nbsp;     i := 1;</div><div class="code_line">&nbsp;     j := N+1;</div><div class="code_line">&nbsp;     repeat</div><div class="code_line">&nbsp;        k := (i+j) div 2;</div><div class="code_line">&nbsp;        if U &#60; X[k] then j := k else i := k</div><div class="code_line">&nbsp;     until j &#60;= i+1</div><div class="code_line">&nbsp;  end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;{ Вычисление сплайна }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  DX := U - X[i];</div><div class="code_line">&nbsp;  Seval := Y[i] + DX*(B[i] + DX*(C[i] + DX*D[i]))</div><div class="code_line">&nbsp;</div><div class="code_line">end { Seval };</div><div class="code_line">&nbsp;</div><div class="code_line">{=================} END. { Unit SplinUNT } {==================}</div></ol></div></div></div></div>]]></description>
        <author>murph</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94496</guid>
        <pubDate>Thu, 04 Jul 2002 06:51:57 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94496</link>
        <description><![CDATA[GrAnd: Задача сведется просто к обычному сглаживанию функции берегов твоей реки. В разделе уже обсуждалась данная тема.<br>Посмотри, например<br><a class='tag-url' href='http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=algorithm;action=display;num=1023115703' target='_blank'>http://pascal.sources.ru/cgi-bin/forum/YaB...;num=1023115703</a>]]></description>
        <author>GrAnd</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94495</guid>
        <pubDate>Wed, 03 Jul 2002 12:50:20 +0000</pubDate>
        <title>Сплайны</title>
        <link>https://forum.sources.ru/index.php?showtopic=9853&amp;view=findpost&amp;p=94495</link>
        <description><![CDATA[the_moon: Привет,<br><br>пишу игрушку, в свободное от работы время ну типа Settlers и нужно генерить мне карту. И надо сгенерить речку мне, можно с притоком :) . Так вот пока я сгенерировал узлы где река будет поворачивать, теперь мне надо это все добро соединить в месте ну и для этого надо сплайны. Слово для меня загадочное ( но суть понимаю ). Так вот есть где алгоритмы рисования. Посоветуйте.<br><br>Да, забыл, естественно толщина ирает большую роль<br><br>Спасибо]]></description>
        <author>the_moon</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	