Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

void approks_analit_funkc_polinomom(int n, int m, float x1, float

Автор: старший преподаватель Лучников В.А.

Иркутск

Лучников В.А. Сборник комьютерных программ (в помощь дипломнику). Учебное пособие – Иркутск: ИрГУПС, 2013.-119 с.

 

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

Учебное пособие содержит тридцать три компьютерные программы на языке Си с примерами их использования. Программы охватывают широкий спектр решаемых задач: матрицы, решение систем линейных и нелинейных алгебраических уравнений, интерполяция, аппроксимация, минимизация, динамические системы, интегрирование, графы. Изложение материала опирается на учебник автора “Программирование на языке Си”.

Данное учебное пособие является шестым в серии учебных пособий по программированию на алгоритмических языках высокого уровня, написанных автором.

 

Содержание

Вычисление определителя матрицы методом Гаусса 5

Вычисление обратной матрицы методом Гаусса 7

Решение системы линейных алгебраических уравнений
методом Гаусса с выбором главного элемента по всей матрице 9

Решение системы линейных алгебраических уравнений
методом Гаусса по схеме Халецкого 12

Решение системы линейных алгебраических уравнений
итерационным методом Гаусса-Зайделя 15

Решение системы несовместных линейных уравнений
методом наименьших квадратов 18

Решение системы нелинейных и трансцендентных уравнений
методом Стеффенсена 21

Решение избыточной системы нелинейных и трансцендентных уравнений
обобщенным методом Ньютона 24

Вычисление комплексных корней алгебраического уравнения
методом Ньютона-Рафсона 27

Вычисление комплексных корней алгебраического уравнения
модифицированным методом Берстоу 29

Вычисление коэффициентов интерполяционного полинома Лагранжа 31

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

Интерполяция табличных функций рациональной дробью 36

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

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

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

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

Аппроксимация табличных функций сплайн-функциями 53

Аппроксимация дробно-рациональной функции
понижением степеней ее числителя и знаменателя 56

Приведение квадратной матрицы к форме Гессенбергера
и вычисление ее собственных значений 59

Вычисление коэффициентов характеристического полинома
и обратной матрицы методом Леверрье-Фаддеева 62

Вычисление коэффициентов характеристического полинома матрицы
методом Данилевского (приведение матрицы к форме Фробениуса) 65

Разложение действительной неособенной квадратной матрицы
на произведение двух треугольных (LU -разложение) 68

Минимизация функции многих переменных
модифицированным методом Пауэлла 71

Минимизация функции многих переменных
методом Давидона-Флетчера-Пауэлла 74

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

Вывод графиков функций 83

Расчет матричной передаточной функции динамической системы
по уравнениям состояния 90

Определение дискретного аналога линейной динамической системы 96

Определение дискретного аналога передаточной функции
методом Тастина 101

Расчет выходного сигнала динамической системы,
заданной передаточной функцией 104

Вычисление определенного интеграла методом Ньютона-Котеса 111

Топологический анализ ориентированных графов 114

 

 

Вычисление определителя матрицы

методом Гаусса

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

  1. описать прототип функции вычисления определителя:

int determinant_Gauss(int n, float a[n][n], float *det);

  1. ввести значение переменной n – размер матрицы,
  2. описать исходную матрицу:

float a[n][n];

  1. ввести матрицу a[n][n],
  2. обратиться к программе вычисления определителя:

determinant_Gauss(n, a, &det);

  1. вывести на экран терминала (в текстовый файл) значение определителя det.

Пример: вычислить определитель матрицы

1 1 1 1

a[3][3] = 1 2 3 4

1 3 6 10

1 4 10 20

В этом случае n=4.

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int determinant_Gauss(int n, float a[n][n], float *det);

int main(int argc, char **argv)

{

int n; // размер матрицы

float det; // определитель матрицы

int i,j; // рабочие переменные

printf(" Razmer matricy n=");

scanf("%d", &n);

float a[n][n]; // исходная матрица

printf(" Vvedite ichodn. matrizu: ");

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

{

printf(" stroka %d (%d chisel): ", i+1, n);

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

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

}

printf(" ");

determinant_Gauss(n, a, &det);

printf(" Znachenie opredelitelja = %f ", det);

return 0;

}

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

 

 

Вычисление обратной матрицы

методом Гаусса

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

  1. описать прототип функции вычисление обратной матрицы:

int invers_Gauss(int n, float a[n][n], float invert[n][n]);

  1. ввести значение переменной n – размер матрицы,
  2. описать исходную и обратную матрицы:

float a[n][n], invert[n][n];

  1. ввести матрицу a[n][n],
  2. обратиться к программе вычисления обратной матрицы:

invers_Gauss(n, a, invert);

  1. вывести на экран терминала (в текстовый файл) вычисленную обратную матрицу.

Пример: вычислить обратную матрицу для исходной матрицы

1 1 1 1

a[3][3] = 1 2 3 4

1 3 6 10

1 4 10 20

В этом случае n=4.

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int invers_Gauss(int n, float a[n][n], float invert[n][n]);

int main(int argc, char **argv)

{

int n; // размер матрицы

int i,j; // рабочие переменные

printf(" Razmer matricy n=");

scanf("%d", &n);

float a[n][n]; // исходная матрица

float invert[n][n]; // обратная матрица

printf(" Vvedite ichodn. matriсu: ");

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

{

printf(" stroka %d (%d chisel): ", i+1, n);

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

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

}

printf(" ");

invers_Gauss(n, a, invert);

printf(" Obratnaja matrica: ");

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

{

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

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

printf(" ");

}

printf(" ");

return 0;}

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

Решение системы линейных алгебраических уравнений

методом Гаусса с выбором главного элемента по всей матрице

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

  1. описать прототип функции решения системы уравнений:

int Gauss(int n, float a[n][n], float b[n], float x[n]);

  1. ввести значение переменной n – порядок системы уравнений,
  2. описать массивы:

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор решения (вектор неизвестных)

  1. ввести массивы a[n][n] и b[n],
  2. обратиться к программе решения системы уравнений:

Gauss(n, a, b, x)

  1. вывести на экран терминала (в текстовый файл) вектор решения.

Пример: решить систему уравнений

x1 – 3x2 + 2x3 = 5;

3x1 - 4x2 = 7;

2x1 - 5x2 + 3x3 = 9;

В этом случае n=3;

1 -3 2 5

a[3][3]= 3 -4 0 b[3]= 7

2 -5 3 9

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Gauss(int n, float a[n][n], float b[n], float x[n]);

int main(int argc, char **argv)

{

int n; // порядок системы уравнений

int i,j; // рабочие переменные

printf(" porjadok sistemy uravn. n=");

scanf("%d", &n);

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // вектор свободных членов

float x[n]; // вектор решения системы уравнений

printf(" vvedite matrizu koeff. sistemy postrochno: ");

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

{

printf(" stroka %d (%d chisel): ", i+1, n);

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

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

}

printf(" ");

printf(" vvedite vektor svobodn. chlenov: ");

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

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

printf(" ");

Gauss(n, a, b, x);

printf(" Reshenie sistemy uravn.: ");

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

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

printf(" ");

return 0;

}

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

Таким образом,

x1=5.0 x2=2.0 x3=3.0

 

Решение системы линейных алгебраических уравнений

методом Гаусса по схеме Халецкого

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

1. описать прототип функции решения системы уравнений:

int Gauss_Haleckij(int n, float a[n][n], float b[n], float x[n]);

2. ввести значение переменной n – порядок системы уравнений,

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

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор решения (вектор неизвестных)

4. ввести массивы a[n][n] и b[n],

5. обратиться к программе решения системы уравнений:

Gauss_Haleckij(n, a, b, x);

6. вывести на экран терминала (в текстовый файл) вектор решения.

Пример: решить систему уравнений

x1 – 3x2 + 2x3 = 5;

3x1 - 4x2 = 7;

2x1 - 5x2 + 3x3 = 9;

В этом случае n=3;

1 -3 2 5

a[3][3]= 3 -4 0 b[3]= 7

2 -5 3 9

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Gauss_Haleckij(int n, float a[n][n], float b[n], float x[n]);

int main(int argc, char **argv)

{

int n; // порядок системы уравнений

int i,j; // рабочие переменные

printf(" porjadok sistemy uravn. n=");

scanf("%d", &n);

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // вектор свободных членов

float x[n]; // вектор решения системы уравнений

printf(" vvedite matrizu koeff. sistemy postrochno: ");

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

{

printf(" stroka %d (%d chisel): ", i+1, n);

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

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

}

printf(" ");

printf(" vvedite vektor svobodn. chlenov: ");

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

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

printf(" ");

Gauss_Haleckij(n, a, b, x);

printf(" Reshenie sistemy uravn.: ");

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

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

printf(" ");

return 0;

}

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

Таким образом,

x1=5.0 x2=2.0 x3=3.0

 

 

Решение системы линейных алгебраических уравнений

итерационным методом Гаусса-Зайделя

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

1. описать прототип функции решения системы уравнений:

int Gauss_Zaidel(int n, float a[n][n], float b[n], float eps, int count, float x[n]);

2. ввести значение переменной n – порядок системы уравнений,

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

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор решения (вектор неизвестных)

4. ввести массивы a[n][n] и b[n],

5. ввести погрешность вычислений eps и максимальное количество итераций count,

6. обратиться к программе решения системы уравнений:

Gauss_Zaidel(n, a, b, eps, count, x);

7. вывести на экран терминала (в текстовый файл) вектор решения.

Пример: решить систему уравнений

x1 + 0,17x2 - 0,25x3 + 0,54x4 = 0,3;

0,47x1 + x2 + 0.67x3 - 0,32x4 = 0,5;

-0,11x1 + 0,35x2 + x3 - 0,74x4 = 0,7;

0,55x1 + 0,43x2 + 0,36x3 - x4 = 0,9;

В этом случае n=4;

1.0 0,17 0,25 0,54 0,3

a[4][4]= 0,47 1.0 0.67 0,32 b[4] = 0,5

-0,11 0,35 1.0 0,74 0,7

0,55 0,43 0,36 1.0 0,9

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Gauss_Zaidel(int n, float a[n][n], float b[n], float eps, int count, float x[n]);

int main(int argc, char **argv)

{

int n; // порядок системы уравнений

int count; // заданное количество итераций

int i,j; // рабочие переменных

printf(" porjadok sistemy uravn. n=");

scanf("%d", &n);

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // вектор свободных членов

float x[n]; // вектор решения системы уравнений

float eps; // заданная точность вычислений

printf(" vvedite matrizu koeff. sistemy postrochno: ");

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

{

printf(" stroka %d (%d chisel): ", i+1, n);

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

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

}

printf(" ");

printf(" vvedite vektor svobodn. chlenov (%d chisel): ", n);

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

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

printf(" ");

printf(" pogreshn. vychisl. eps=");

scanf("%g", &eps);

printf(" max kolich. iteraciy count=");

scanf("%d", &count);

Gauss_Zaidel(n, a, b, eps, count, x);

printf(" Reshenie sistemy uravn.: ");

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

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

printf(" ");

return 0;

}

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

Таким образом,

x1=0.441 x2=-0.363 x3=1.667 x4=0.3935

 

Решение системы несовместных линейных уравнений
методом наименьших квадратов

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

1. описать прототип функции решения системы уравнений:

int nesovmest(int n, int kk, float a[kk][n], float b[kk], float x[n], float y[kk], float *s0);

2. ввести значение переменной n – порядок системы уравнений,

3. ввести значение переменной k – количество уравнений (k>n),

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

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор оценок неизвестных

float y[n]; // вектор невязок

5. ввести массивы a[n][n] и b[n],

6. обратиться к программе решения системы уравнений:

nesovmest(n, k, a, b, x, y, &s0);

7. вывести на экран терминала (в текстовый файл) вектор оценок неизвестных, вектор невязок и среднеквадратическую невязку

Пример: решить систему уравнений

2x1 + 3x2 = 5;

x1 - 2x2 = 7;

2x1 - x2 = 8;

В этом случае n=2, k=3;

2 3 5

a[3][2]= 1 -2 b[3]= 7

2 -1 9

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int nesovmest(int n, int kk, float a[kk][n], float b[kk], float x[n], float y[kk], float *s0);

int main(int argc, char **argv)

{

int n; // количество неизвестных

int k; // количество уравнений (k>n)

float s0; // среднеквадратическая невязка

int i,j; // рабочие переменные

printf(" Kol-vo neizvestn. n=");

scanf("%d", &n);

printf(" Kol-vo uravnen. (k>n) k=");

scanf("%d", &k);

float a[k][n]; //матрица коэффициентов системы уравнений

float b[k]; // вектор свободных членов

float x[n]; // вектор оценок неизвестных

float y[k]; // вектор невязок

printf(" vvedite matrizu koeff. sistemy postrochno: ");

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

{

printf(" stroka %d (%d znachenij): ", i+1, n);

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

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

}

printf(" ");

printf(" vvedite vektor svobodn. chlenov (%d znachenij): ", k);

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

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

printf(" ");

nesovmest(n, k, a, b, x, y, &s0);

printf(" Ocenki neizvestnyh: ");

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

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

printf(" ");

printf(" Vector nevjazok: ");

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

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

printf(" ");

printf(" Srednekv. nevjazka: %e ", s0);

return 0;

}

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

Таким образом,

x1=3.902 x2=-1.057

Решение системы нелинейных и трансцендентных уравнений
методом Стеффенсена

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

1. описать прототип функции решения системы уравнений:

int Steffensen(int n, float eps, int count, float x[n], float y[n]);

2. ввести значение переменной n – количество неизвестных,

3. ввести значение переменной eps – погрешность вычислений,

4. ввести значение переменной count – заданное количество итераций,

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

float x[n]; // вектор решения системы уравнений

float y[n]; // вектор невязок

6. описать систему уравнений в функции:

void pr_chasti(int n, float x[n], float b[n])

в виде b[i]=b(x[j]); i,j=0…n-1,

7. ввести массив x[n] – вектор начальных приближений неизвестных,

8. обратиться к программе решения системы уравнений:

Steffensen(n, eps, count, x, y);

9. вывести на экран терминала (в текстовый файл) вектор решения x[n] и вектор невязок y[n].

Пример: решить систему уравнений

3x12 + 1,5x22 - x32 - 5 = 0;

6x1x2x3 - x1 + 5x2 + 3x3 = 0;

5x1x3 - x2x3 - 1 = 0;

В этом случае n=3, eps=1.0e-6, count=20.

Начальные приближения неизвестных:

x1=0.1, x2=0.2, x3=0.3

Система уравнений описывается в функции:

void pr_chasti(int n, float x[n], float b[n])

// описание правых частей системы уравнений в виде

// b[i]=b(x[j]); i,j=0…n-1,

{

b[0]=3.0*x[0]*x[0]+1.5*x[1]*x[1]+x[2]*x[2]-5.0;

b[1]=6.0*x[0]*x[1]*x[2]-x[0]+5.0*x[1]+3.0*x[2];

b[2]=5.0*x[0]*x[2]-x[1]*x[2]-1.0;

}

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Steffensen(int n, float eps, int count, float x[n], float y[n]);

int main(int argc, char **argv)

{

int n; // количество неизвестных

int count; // заданное количество итераций

float eps; // заданная погрешность вычислений

int i,j; // рабочие переменные

printf(" kolichestvo neizvestnyh n=");

scanf("%d", &n);

float x[n]; // вектор решения системы уравнений

float y[n]; // вектор невязок

printf(" vektor nachalnyh priblisheniy: ");

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

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

printf(" pogreshn. vychisl. eps=");

scanf("%g", &eps);

printf(" max kolich. iteraciy count=");

scanf("%d", &count);

Steffensen(n, eps, count, x, y);

printf(" Reshenie sistemy uravn.: ");

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

printf("%12.6f", x[i]);

printf(" ");

printf(" Vektor nevjazok: ");

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

printf("%e ", y[i]);

printf(" ");

return 0;

}

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

Таким образом,

x1=1.2845 x2=0.1298 x3=0.1589

Решение избыточной системы нелинейных и трансцендентных уравнений
обобщенным методом Ньютона

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

1. описать прототип функции решения системы уравнений:

int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);

2. ввести значение переменной n – количество неизвестных,

3. ввести значение переменной m (m>=n) – количество уравнений,

4. ввести значение переменной eps – погрешность вычислений,

5. ввести значение переменной count – заданное количество итераций,

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

float x[n]; // вектор решения системы уравнений

float y[n]; // вектор невязок

7. описать систему уравнений в функции:

void pr_chasti(int n, float x[n], float b[n])

в виде b[i]=b(x[j]); i,j=0…n-1,

8. ввести массив x[n] – вектор начальных приближений неизвестных,

9. обратиться к программе решения системы уравнений:

Newton(n, m, &iter, eps, x, y, &s0);

10. вывести на экран терминала (в текстовый файл) вектор решения x[n], вектор невязок y[n], количество выполненных итераций iter и среднеквадратическую невязку s0.

Пример: решить систему уравнений

x12 + x22 - x3 - 0,5 = 0;

0,75x13 - x2 + x32 + 0,65 = 0;

x1x33 + 0,25 = 0;

В этом случае n=3, eps=1.0e-6, count=20.

Начальные приближения неизвестных:

x1=0.1, x2=0.1, x3=0.1

Система уравнений описывается в функции:

void pr_chasti(int n, float x[n], float b[n])

// описание правых частей системы уравнений в виде

// b[i]=b(x[j]); i,j=0…n-1,

{

b[0]=x[0]*x[0]+x[1]*x[1]-x[2]-0.5;

b[1]=0.75*x[0]*x[0]*x[0]-x[1]+x[2]*x[2]+0.65;

b[2]=x[0]*x[2]*x[2]*x[2]+0.25;

}

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);

int main(int argc, char **argv)

{

int n; // количество неизвестных

int m; // количество уравнений (m>=n)

int iter; // заданное количество итераций

float eps; // заданная погрешность вычислений

float s0; // среднеквадратическая невязка

int i; // рабочая переменная

printf(" Kol-vo neizvestn. n=");

scanf("%d", &n);

printf(" Kol-vo uravnen. (m>=n) m=");

scanf("%d", &m);

float x[n]; // вектор оценок неизвестных

float y[m]; // вектор невязок

printf(" Kol-vo iteracij iter=");

scanf("%d", &iter);

printf(" Pogreshn. vychislenij eps=");

scanf("%e", &eps);

printf(" vvedite vektor nachaln. priblishenij (%d znachenij): ", n);

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

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

printf(" ");

Newton(n, m, &iter, eps, x, y, &s0);

printf(" Kol-vo iteracij: %d ", iter);

printf(" Ocenki neizvestnyh: ");

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

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

printf(" ");

printf(" Vector nevjazok: ");

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

printf("%e ", y[i]);

printf(" ");

printf(" Srednekv. nevjazka: %e ", s0);

return 0; }

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

Таким образом,

x1=-1.042 x2=0.1867 x3=0.6213

Вычисление комплексных корней алгебраического уравнения

методом Ньютона-Рафсона

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

1. описать прототип функции вычисления корней:

int Newton_Rafson(int n, float q[n+1], float p[2][n]);

2. ввести значение переменной n – степень уравнения,

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

float q[n+1]; // вектор коэффициентов исходного уравнения

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

float p[2][n]; // массив корней уравнения:

// первая строка – действительные части,

// вторая строка – мнимые части,

4. ввести массив q[n+1] – вектор коэффициентов исходного уравнения,

5. обратиться к программе вычисления корней:

Newton_Rafson(n, q, p);

6. вывести на экран терминала (в текстовый файл) массив корней уравнения

Пример: определить корни алгебраического уравнения

x3 – 3x2 + 4x – 12 = 0

В этом случае n=3, вектор коэффициентов уравнения:

q[4]=(-12, 4, -3, 1).

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Newton_Rafson(int n, float q[n+1], float p[2][n]);

int main(int argc, char **argv)

{

int n; // степень уравнения

int i; // рабочая переменная

char c; // рабочая переменная

printf(" stepeny uravnenia n=");

scanf("%d", &n);

float q[n+1]; // вектор коэффициентов исходного уравнения // по возрастанию степеней

float p[2][n]; // массив корней уравнения

printf(" vektor koefficientov: ");

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

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

Newton_Rafson(n, q, p);

printf(" Korni uravnenija");

printf(" Dejstvit. chasti Mnimye chasti ");

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

printf(" %12.6f %12.6f ", p[0][i], p[1][i]);

printf(" ");

c=getch();

return 0;

}

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

Таким образом,

x1=3.0 x2,3=0.0 ± j 2.0

 

Вычисление комплексных корней алгебраического уравнения

модифицированным методом Берстоу

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

1. описать прототип функции вычисления корней:

int Bairstow(int n, float q[n+1], float p[2][n]);

2. ввести значение переменной n – степень уравнения,

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

float q[n+1]; // вектор коэффициентов исходного уравнения

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

float p[2][n]; // массив корней уравнения:

// первая строка – действительные части,

// вторая строка – мнимые части,

4. ввести массив q[n+1] – вектор коэффициентов исходного уравнения,

5. обратиться к программе вычисления корней:

Bairstow(n, q, p);

6. вывести на экран терминала (в текстовый файл) массив корней уравнения

Пример: определить корни алгебраического уравнения

2x3 + 3x2 + 3x + 1 = 0

В этом случае n=3, вектор коэффициентов уравнения:

q[4]=(1, 3, 3, 2).

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Bairstow(int n, float q[n+1], float p[2][n]);

int main(int argc, char **argv)

{

int n; // степень уравнения

int i; // рабочая переменная

char c; // рабочая переменная

printf(" stepeny uravnenia n=");

scanf("%d", &n);

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

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

float p[2][n]; // массив корней уравнения:

// первая строка - действит. части,

// вторая – мнимыечасти

printf(" vektor koefficientov: ");

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

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

Bairstow(n, q, p);

printf(" Korni uravnenija");

printf(" Dejstvit. chasti Mnimye chasti ");

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

printf(" %12.6f %12.6f ", p[0][i], p[1][i]);

printf(" ");

c=getch();

return 0; }

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

Таким образом,

x1=-2.0 x2,3=-0.5 ± j 0.866

Вычисление коэффициентов интерполяционного полинома Лагранжа

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

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

void interpol_Lagrang(int n, float x[n], float y[n], float q[n]);

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

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

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

// в узлах интерполяции

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

// интерполяционного полинома Лагранжа

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

4. ввести массивы x [n], y[n],

5. обратиться к программе вычислений:

interpol_Lagrang(n, x, y, q);

6. вывести на экран терминала (в текстовый файл) вектор коэффициентов.

Пример: определить коэффициенты интерполяционного полинома Лагранжа для функции, заданной в четырех точках:

x 23,3 24,25 25,25 26,1
y        

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

void interpol_Lagrang(int n, float x[n], float y[n], float q[n]);

int main(int argc, char **argv)

{

int n; // количество узлов интерполяции

int i; // рабочая переменная

printf(" uzlov interpoljacii n= ");

scanf("%d", &n);

float x[n], y[n]; // исходные узлы интерполяции

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

//интерполяционного полинома Лагранжа

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

printf(" Vvedite vector argumenta (%d znacheniy): ", n);

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

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

printf(" ");

printf(" Vvedite vector funkcii (%d znacheniy): ", n);

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

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

printf(" ");

interpol_Lagrang(n, x, y, q);

printf(" Koefficienty interpol. polinoma Lagranga po vozrast. stepeney: ");

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

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

printf(" ");

return 0;

}

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

Таким образом, интерполяционный полином Лагранжа имеет вид:

29451,52 – 3499,265x + 138,406x2 – 1,799x3

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

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

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

int Furie_interpol_analit(int n, float a[], float b[]);

  1. ввести значение переменной n – количество слагаемых ряда Фурье,
  2. описать выходные массивы:

float a[n]; // коэффициенты ряда Фурье при cos(), начиная с // нулевого (n+1 коэффициент)

float b[n]; // коэффициенты ряда Фурье при sin(), начиная с // нулевого (n+1 коэффициент)

  1. обратиться к программе расчета коэффициентов:

Furie_interpol_analit(n, a, b);

  1. вывести на экран терминала (в текстовый файл) массивы коэффициентов ряда Фурье.

В функции float function(float x) описать исходную функцию в виде f=f(x), например:

Float function(float x)

{

float f;

f=x*x;

if(x>M_PI)

f=(2.0*M_PI-x)*(2.0*M_PI-x);

return f;

}

Пример: найти коэффициенты ряда Фурье для функции

x2, если x≤π,

f(x)=

(2π – x), если x>π.

Ряд Фурье для этой функции имеет вид:

f(x) = 3,289868 – 4/1! cos(x) + 4/2! cos(2x) – 4/3! cos(3x) + 4/4! cos(4x) - …

 

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Furie_interpol_analit(int n, float a[], float b[]);

int main(int argc, char **argv)

{

int n; // количество слагаемых ряда Фурье

int i; // рабочая переменная

printf(" Kol-vo slagaem. n=");

scanf("%d", &n);

float a[n]; //коэффициенты ряда Фурье при cos(),

//начиная с нулевого (n+1 коэффициент)

float b[n]; //коэффициенты ряда Фурье при sin(),

//начиная с нулевого (n+1 коэффициент)

Furie_interpol_analit(n, a, b);

printf(" Koeff. pri cos(): ");

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

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

printf(" ");

printf(" Koeff. pri sin(): ");

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

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

printf(" ");

return 0;

}

Описание аппроксимируемой функции:

Float function(float x)

{

float f;

f=x*x;

if(x>M_PI) // M_PI – константа π в языке Си

f=(2.0*M_PI-x)*(2.0*M_PI-x);

return f;

}

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

при n=5:

Таким образом, ряд Фурье для исходной функции имет вид:

f(x) = 3,2627 – 3,944 cos(x) + 0,939 cos(2x) – 0,3741 cos(3x) + 0,1638 cos(4x) – 0,0474 cos(5x)

Интерполяция табличных функций рациональной дробью

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

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

void interpol_drobju(int n, float x[n], float y[n], float q[n], float b[n], float d[n]);

  1. ввести значение переменной n – количество узлов интерполяции,
  2. описать массивы:

 

float x[n]; // значения аргумента

float y[n]; // значения функции

float q[n]; // коэффициенты интерполяционной цепной дроби

float b[n]; // коэффициенты числителя интерполяционной

// рациональной дроби

float d[n]; // коэффициенты знаменателя интерполяционной

// рациональной дроби

  1. ввести массивы x[n] и y[n],
  2. обратиться к программе вычисления коэффициентов:

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

  1. вывести на экран терминала (в текстовый файл) массивы коэффициентов q[n], b[n] и d[n].

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

x          
y   2.5 1.667 2.25 2.125

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

#include <stdio.h>

#include <math.h>

#include <conio.h>

void interpol_drobju(int n, float x[n], float y[n], float q[n], float b[n], float d[n]);

int main(int argc, char **argv)

{

int n; // количество узлов интерполяции

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

char c;

printf(" uzlov interpoljacii n= ");

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...