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. описать прототип функции: