Interpol_drobju(n, x, y, q, b, d);

printf("\nKoefficienty interpol. cepnoy drobi:\n");

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

printf("%10.3f", q[i]);

printf("\n\n");

printf("\nKoefficienty chislit. interpol. drobi:\n");

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

printf("%10.3f", b[i]);

printf("\n\n");

printf("\nKoefficienty znamenat. interpol. drobi:\n");

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

printf("%10.3f", d[i]);

printf("\n\n");

c=getch();

return 0;}

Результат решения задачи:

Таким образом, интерполяционная цепная дробь имеет вид:

3 +

Интерполяционная рациональная дробь имеет вид:

(-6 – x + 2x2) / (-2 – x + x2)

Аппроксимация табличных функций степенным полиномом
методом наименьших квадратов

В головной программе необходимо:

1. описать прототип функции:

void approks_polinomom(int m, int n, float x[m], float y[m], float q[n+1], float *s0);

2. ввести значение переменной m – количество узлов аппроксимации,

3. ввести значение переменной n – степень аппроксимирующего полинома (n<=m-1),

4. описать массивы:

float x[m], y[m]; // значения аргумента и функции

// в узлах аппроксимации

float q[n+1]; // вектор коэффициентов

// аппроксимирующего полинома

// по возрастающим степеням

5. ввести массивы x[m], y[m],

6. обратиться к программе вычислений коэффициентов аппроксимирующего полинома:

approks_polinomom(m, n, x, y, q, &s0);

7. вывести на экран терминала (в текстовый файл) вектор коэффициентов q[n+1] и среднеквадратическую погрешность аппроксимации s0.

Пример: аппроксимировать кубическим полиномом функцию, заданную таблицей ее значений:

x 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0
y 2.5 0.75 -1.15 -2.75 -3.85 -4.15 -3.55 -2.25 -0.15 2.15 4.55

 

В этом случае m=11, n=3.

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

void approks_polinomom(int m, int n, float x[m], float y[m], float q[n+1], float *s0);

int main(int argc, char **argv)

{

int m;// количество узлов аппроксимации

int n;// степень аппроксимирующего полинома, n<m

float s0;// среднеквадратическая погрешность аппроксимации

int i;// рабочая переменная для ввода исходных данных

Char c0;

printf("\nUzlov approksimacii m= ");

scanf("%d", &m);

printf("\nSteprn approks. polinoma n (n<m)= ");

scanf("%d", &n);

float x[m], y[m];// исходные узлы аппроксимации

float q[n+1];// массив коэффициентов

// аппроксимирующего полинома

// по возрастанию степеней

printf("\nVvedite vector argumenta (%d znacheniy):\n", m);

for (i=0; i<m; i++)

scanf("%f", &x[i]);

printf("\n");

printf("\nVvedite vector funkcii (%d znacheniy):\n", m);

for (i=0; i<m; i++)

scanf("%f", &y[i]);

printf("\n");

printf("\nApproksimacija polinomom\n");

approks_polinomom(m, n, x, y, q, &s0);

printf("\nKoefficienty approks. polinoma po vozrast. stepeney:\n");

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

printf("%10.5f", q[i]);

printf("\n");

printf("\nSrednekvadr. pogreshn. approksimacii: %e\n", s0);

c0=getch();

Return 0;

}

Результат работы программы:

Таким образом, аппроксимирующий полином имеет вид:

2,848 – 13,529x + 6,528x2 + 0,374x3

Аппроксимация табличных функций суммой линейно независимых функций
методом наименьших квадратов

В головной программе необходимо:

1. описать прототип функции:

void approks_summoj_funkc(int m, int n, float x[m], float y[m], float q[n+1], float *s0);

2. ввести значение переменной m – количество узлов аппроксимации,

3. ввести значение переменной n – количество слагаемых аппроксимирующей функции (n<=m-1),

4. описать массивы:

float x[m], y[m]; // значения аргумента и функции

// в узлах аппроксимации

float q[n+1]; // вектор коэффициентов

// аппроксимирующей функции

5. описать слагаемые аппроксимирующей функции:

void slagaemye(float x, float f[])

//

// Описание слагаемых суммы линейно независимых функций

//

// Слагаемые описываются как элементы массива f[n+1]:

// n - количество слагаемых;

// нулевой элемент массива обязательно равен 1.0:

// f[0]=1.0;

// все остальные элементы - аппроксимирующие функции-слагаемые с аргументом x,

// например:

// f[0]=1.0; - свободный член - обязательно!

// f[1]=sin(x);

// f[2]=exp(2.0*x);

// и т.д.

//

{

}

6. ввести массивы x[m], y[m],

7. обратиться к программе вычислений коэффициентов аппроксимирующей функции:

approks_summoj_funkc(m, n, x, y, q, &s0)

8. вывести на экран терминала (в текстовый файл) вектор коэффициентов q[n+1] и среднеквадратическую погрешность аппроксимации s0.

Пример: аппроксимировать функцию, заданную таблицей ее значений:

x 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0
y 2.5 0.75 -1.15 -2.75 -3.85 -4.15 -3.55 -2.25 -0.15 2.15 4.55

следующей функцией:

f(x)=q0 + q1sin(x) + q2cos(x) + q3sin(2x) + q4cos(2x)

В этом случае m=11, n=4(количество линейно независимых слагаемых).

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

void approks_summoj_funkc(int m, int n, float x[m], float y[m], float q[n+1], float *s0);

int main(int argc, char **argv)

{

int m;// количество узлов аппроксимации

int n;// количество линейно независимых слагаемых
// в аппроксимирующей функции

float s0;// среднеквадратическая погрешность аппроксимации

int i;// рабочая переменная для ввода исходных данных

Char c0;

printf("\nUzlov approksimacii m= ");

scanf("%d", &m);

printf("\nKolichestvo approks. funkc. n (n<m) = ");

scanf("%d", &n);

float x[m], y[m];// исходные узлы аппроксимации

float q[n+1];// массив коэффициентов при слагаемых

// аппроксимирующей функции

printf("\nVvedite vector argumenta (%d znacheniy):\n", m);

for (i=0; i<m; i++)

scanf("%f", &x[i]);

printf("\n");

printf("\nVvedite vector funkcii (%d znacheniy):\n", m);

for (i=0; i<m; i++)

scanf("%f", &y[i]);

printf("\n");

printf("\nApproksimacija summoj funkcij\n");

approks_summoj_funkc(m, n, x, y, q, &s0);

printf("\nKoefficienty pri approks. funkcijah:\n");

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

printf("%10.5f", q[i]);

printf("\n");

printf("\nSrednekvadr. pogreshn. approksimacii: %e\n", s0);

c0=getch();

Return 0;

}

Описание слагаемых аппроксимирующей функции:

void slagaemye(float x, float f[])

//

// Описание слагаемых суммы линейно независимых функций

//

// Слагаемые описываются как элементы массива f[n+1]:

// n - количество слагаемых;

// нулевой элемент массива обязательно равен 1.0: // f[0]=1.0;

// все остальные элементы - аппроксимирующие функции-

// слагаемые с аргументом x,

// например:

// f[0]=1.0; - свободный член - обязательно!

// f[1]=sin(x);

// f[2]=exp(2.0*x);

// и т.д.

//

{

f[0]=1.0;

f[1]=sin(x);

f[2]=cos(x);

f[3]=sin(2.0*x);

f[4]=cos(2.0*x);

}

Результат работы программы:

Таким образом, аппроксимирующая функция имеет вид:

f(x)=0,687 + 1,763 sin(x) – 1,145 cos(x) – 4,906 sin(2x) + 2,964cos(2x)

 

 

Аппроксимация функций, заданных аналитически, степенным полиномом
методом наименьших квадратов

В головной программе необходимо:

1. описать прототип функции: