Название: Информатика - Алгоритмы и программы (Н.В. Усольцев)

Жанр: Информатика

Просмотров: 1278


5. программное обеспечение к работе

В лабораторной работе используется ряд готовых функций, объединенных в два модуля:

Polynom – модуль, содержащий функции интерполяции полиномами;

Spline – модуль функций сплайн-интерполяции.

Модуль Polynom содержит следующие основные функции:

IntClassic() – интерполяция классическим полиномом;

IntLagrange() – интерполяция полиномом Лагранжа.

Заголовок функции IntClassic() имеет вид:

int IntClassic(int n, Vector X, Vector Y, Vector A)

 

Входные параметры

n – порядок интерполирующего полинома (число точек в таблице зависимости y(x) должно быть на единицу больше);

X – одномерный массив значений аргумента;

Y – одномерный массив значений функции.

Входные параметры

A –      одномерный массив коэффициентов   полинома A[0]...A[n].

Возвращаемое значение функции имеет смысл кода ошибки и равно нулю при успешном  выполнении интерполяции.

Заголовок функции IntLagrang() имеет вид:

double IntLagrange(int n, Vector X, Vector Y, double x)

Входные параметры

n – порядок интерполирующего полинома (число точек в таблице зависимости y(x) должно быть на единицу больше);

X – одномерный массив значений аргумента;

Y – одномерный массив значений функции;

x – значение аргумента, для которого вычисляется значение функции.

Возвращаемое значение функции и представляет собой это вычисляемое по интерполяционной формуле значение функции.

Модуль Spline содержит следующие основные функции:

SplineCoeff() – расчет коэффициентов кубических сплайнов;

Spline() – расчет значения функции по сплайн-интерполяции по предварительно вычисленным коэффициентам.

Заголовок функции SplineCoeff() имеет вид:

int SplineCoeff(int n, Vector X, Vector Y,

Vector A, Vector B, Vector C,Vector D)

Входные параметры

n – число интервалов интерполяции;

X, Y – одномерные массивы – таблицы точек  и , по которым проводится интерполяция (тип элементов double); нумерация элементов в них начинается с нулевого. Число точек на единицу больше числа интервалов.

Выходные параметры

A,B,C и D – одномерные массивы коэффициентов сплайнов.

Возвращаемое значение  представляет собой код ошибки: оно равно 0 при благополучном завершении интерполяции. Остальные значения объяснены во входном комментарии подпрограммы.

Заголовок функции Spline() имеет вид:

double Spline(int n, Vector X, Vector A, Vector B,

Vector C, Vector D, double x)

Входные параметры

n – число интервалов интерполяции;

X – одномерный массив, таблица значений  – границ интервалов интерполяции;

A, B, C, D – одномерные массивы коэффициентов сплайнов, определенных с помощью SplineCoeff();

x – значение аргумента, при котором вычисляется значение функции по сплайну.

Возвращаемое значение представляет собой значение функции по сплайн-интерполяции.

В работе также используется функция WriteSpline() из модуля DataFile. Эта функция предназначены для вывода в файл текста, который представляет собой синтаксически правильную функцию на языке С/С++, имеющую заголовок:

double y(double x)

и выполняющую расчет значения функции по формуле кубического сплайна с жестко присвоенными коэффициентами. Она может компилироваться, присоединяться к любому проекту и использоваться для любых расчетов.

Заголовок функции WriteSpline() имеет вид:

void WriteSpline(int n, Vector X, Vector A, Vector B, Vector C, Vector D,

string FileName=STRING0)

Все ее параметры входные:

n – число интервалов сплайн-интерполяции;

X – массив значений аргумента в точках интерполяции;

A, B, C, D – массивы коэффициентов сплайн-интерполяции;

FileName – имя файла (может не задаваться).

Пример текста, создаваемого в виде файла функцией WriteSpline(), показан на листинге 1.

Листинг 1

#include "define.h"

 

double y(double x)

{

// описание типов

     int i,j,n;

     double dx,Spl;

     Vector X,A,B,C,D;

 

// точки интерполяции

      n=10;

      X[ 0]= 0.0000000E+00;

      X[ 1]= 1.0000000E+00;

      X[ 2]= 2.0000000E+00;

      X[ 3]= 3.0000000E+00;

      X[ 4]= 4.0000000E+00;

      X[ 5]= 5.0000000E+00;

      X[ 6]= 6.0000000E+00;

      X[ 7]= 7.0000000E+00;

      X[ 8]= 8.0000000E+00;

      X[ 9]= 9.0000000E+00;

      X[10]=1.0000000E+01;

 

// коэфффициенты сплайнов

      A[ 1]= 0.0000000E+00;  B[ 1]= 9.9878640E-01;

      A[ 2]= 9.4608000E-01;  B[ 2]= 8.4066720E-01;

      A[ 3]= 1.6054100E+00;  B[ 3]= 4.5477479E-01;

      A[ 4]= 1.8486500E+00;  B[ 4]= 4.7943623E-02;

      A[ 5]= 1.7582000E+00;  B[ 5]=-1.8817928E-01;

      A[ 6]= 1.5499300E+00;  B[ 6]=-1.9138648E-01;

      A[ 7]= 1.4246900E+00;  B[ 7]=-4.6804782E-02;

      A[ 8]= 1.4546000E+00;  B[ 8]= 9.2615612E-02;

      A[ 9]= 1.5741900E+00;  B[ 9]= 1.2484234E-01;

      A[10]=1.6650400E+00;   B[10]= 3.9335047E-02;

 

      C[ 1]= 0.0000000E+00;  D[ 1]=-5.2706399E-02;

      C[ 2]=-1.5811920E-01;  D[ 2]=-2.3218004E-02;

      C[ 3]=-2.2777321E-01;  D[ 3]= 1.6238417E-02;

      C[ 4]=-1.7905796E-01;  D[ 4]= 4.0664338E-02;

      C[ 5]=-5.7064947E-02;  D[ 5]= 3.6974232E-02;

      C[ 6]= 5.3857749E-02;  D[ 6]= 1.2288735E-02;

      C[ 7]= 9.0723953E-02;  D[ 7]=-1.4009170E-02;

      C[ 8]= 4.8696441E-02;  D[ 8]=-2.1722053E-02;

      C[ 9]=-1.6469718E-02;  D[ 9]=-1.7522618E-02;

      C[10]=-6.9037571E-02;  D[10]= 2.3012524E-02;

 

// определение номера интервала, в который попадает x

      j=0;

      for (i=1; i<=n; i++)

        if ((x >= X[i-1])&&(x < X[i]))  j=i;

      if   ((x >= X[n-1])&&(x <= X[n])) j=n;

      if (j==0) return 0.0;

 

//  вычисление значения сплайна

      dx=x-X[j-1];

      Spl=A[j]+B[j]*dx+C[j]*dx*dx+D[j]*dx*dx*dx;

 

//  завершение

      return Spl;

}

 

6. Задание к работе

1. Проанализировать текст функций модуля Polynom и восстановить лежащие в их основе алгоритмы и формулы.

2. Разработать управляющую программу для интерполяции табличной функции с помощью функции IntClassic(). Выполнить интерполяцию функции

 

0,0

1,0

2,0

3,0

4,0

5,0

4,0

18,0

21,0

17,0

19,0

33,5

 

После получения коэффициентов интерполирующего полинома с помощью функции WritePolinom() создать на диске текст функции на языке С/С++, моделирующий этот полином. Используя эту функцию, построить его график с большим (порядка 100) количеством точек. Добавить на этот график исходные точки.

3. Разработать управляющую программу для интерполяции табличной функции с помощью функции IntLagrange(). Выполнить интерполяцию функции из предыдущего пункта и представить результат на графике в виде непрерывной зависимости и исходных точек.

4. Проанализировать тексты функций SplineCoeff() и Spline() из модуля Spline, восстановить алгоритмы, лежащие в основе их работы. Сопоставить операторы подпрограмм с вышеприведенными описанием алгоритма и формулами.

5. Разработать управляющую программу для определения коэффициентов сплайн-интерполяции с помощью функции SplineCoeff(). Выполнить сплайн-интерполяцию функции интегрального синуса Si(x) на интервале (0, 10). Исходной информацией является таблица значений интегрального синуса:

 

 

0.0

0.00000

 

6.0

1.42469

1.0

0.94608

 

7.0

1.45460

2.0

1.60541

 

8.0

1.57419

3.0

1.84865

 

9.0

1.66504

4.0

1.75820

 

10.0

1.65835

5.0

1.54993

 

 

 

 

6. С помощью функции WriteSpline() создать на диске текст функции на языке С/С++, моделирующий эту функцию. Используя ее, построить график сплайн-интерполяции интегрального синуса и наложить на него исходные точки (данные хранятся в файле si.dat).

7. Выполнить сплайн-интерполяцию табличной функции, заданной преподавателем.

8. Разработать функцию для изменения числа точек (увеличения или уменьшения) табличной функции на основе ее сплайн-интерполяции.

Литература:  [4 – 7, 11, 12].

 

Лабораторная работа № 10

Численное дифференцирование и интегрирование

 

1. Введение

При решении различных вычислительных задач, часто возникает необходимость расчета значений производных (первой, второй и более старших порядков), а также интегралов. При этом дифференцируемая или интегрируемая функция могут не иметь аналитическое представление, а быть выражены только алгоритмически. Часто функция может быть задана набором небольшого числа точек (экспериментальных или полученных в результате другого расчета).

Вычисление производных основывается на их представлении в виде конечных разностей. Численные методы расчета определенных интегралов основаны на  вычислении  конечных  сумм  значений подынтегральной функции в определенных точках интервала интегрирования.

В лабораторной работе изучаются наиболее распространенные методы численного дифференцирования и интегрирования, разрабатываются реализующие их подпрограммы. Выполняется решение некоторых прикладных задач вычислительной математики, связанных с вычислением производных и интегралов.