Пример: переключательная функция
аппроксимируется рядом Фурье вида:
f(x) = 4/π(sin(x) + sin(3x)/3 + sin(5x)/5 + sin(7x)/7 + …)
Вывести графики первой гармоники y=sin(x) и аппроксимирующего ряда Фурье f(x).
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
void graphics(int n, int k, int amplituda, char path[], float out[][n+1]);
int main(int argc, char **argv)
{
int n; // количество графиков
float h; // шаг вывода
float x0, x1; // начальное и конечное значения аргумента
int k; // количество точек вывода
float x; // аргумент
Float y, f;
int amplituda; // амплитуда графиков функций в позициях
char path[30]="E:/User/graphics.txt"; // полный путь
// к текстовому файлу для вывода данных, например,
// d:/user/out.txt
int i, j, j1; // рабочие переменные
printf("\n Kol-vo grafikov. n=");
scanf("%d", &n);
printf("\n Nachalnoe znach. argumenta x0=");
scanf("%f", &x0);
printf("\n Konechnoe vremja integrir.: x1=");
scanf("%f", &x1);
printf("\n Shag vyvoda h=");
scanf("%f", &h);
printf("\n Max amplituda grafikov amplituda=");
scanf("%d", &lituda);
k=(int)((x1-x0)/h + 1);
float out[k][n+1]; // матрица выходных данных:
// количество строк –
// количество точек вывода: (x1-x0)/h +1
// нулевой столбец - аргумент,
// остальные n столбцов - данные для вывода n графиков
for (i=0; i<k; i++)
for (j=0; j<n+1; j++)
out[i][j]=0.0;
j1=-1;
for (x=x0; x<=x1; x+=h)
{
y=sin(x);
f=4.0/M_PI*(y + sin(3.0*x)/3.0 + sin(5.0*x)/5.0 + sin(7.0*x)/7.0 + sin(9.0*x)/9.0);
j1++;
out[j1][0]=x;
out[j1][1]=y;
out[j1][2]=f;
}
printf("\n-------------------------------");
printf("\n x sin(x) f(x)");
printf("\n-------------------------------\n");
for (i=0; i<j1; i++)
{
for (j=0; j<n+1; j++)
printf ("%10.5f", out[i][j]);
printf("\n");
}
printf("\n");
Graphics(n, k, amplituda, path, out);
Return 0;
}
Результат работы программы:
Результаты, сохраненные в выходном файле:
------------------------------------------------------------------------------------------
| x | g r a p h i c s
------------------------------------------------------------------------------------------
| 0.00000 | 21
| 0.10000 | 1 2
| 0.20000 | 1 2
| 0.30000 | 1 2
| 0.40000 | 1 2
| 0.50000 | 1 2
| 0.60000 | 1 2
| 0.70000 | 1 2
| 0.80000 | 1 2
| 0.90000 | 1 2
| 1.00000 | 1 2
| 1.10000 | 2 1
| 1.20000 | 2 1
| 1.30000 | 2 1
| 1.40000 | 2 1
| 1.50000 | 2 1
| 1.60000 | 2 1
| 1.70000 | 2 1
| 1.80000 | 2 1
| 1.90000 | 2 1
| 2.00000 | 2 1
| 2.10000 | 12
| 2.20000 | 1 2
| 2.30000 | 1 2
| 2.40000 | 1 2
| 2.50000 | 1 2
| 2.60000 | 1 2
| 2.70000 | 1 2
| 2.80000 | 1 2
| 2.90000 | 1 2
| 3.00000 | 1 2
| 3.10000 | 1 2
| 3.20000 | 2 1
| 3.30000 | 2 1
| 3.40000 |2 1
| 3.50000 |2 1
| 3.60000 | 2 1
| 3.70000 | 2 1
| 3.80000 | 2 1
| 3.90000 | 2 1
| 4.00000 | 2 1
| 4.10000 | 2 1
| 4.20000 | 21
| 4.30000 | 1 2
| 4.40000 |1 2
| 4.50000 |1 2
| 4.60000 |1 2
| 4.70000 |1 2
| 4.80000 |1 2
| 4.90000 |1 2
| 5.00000 |1 2
| 5.10000 | 1 2
| 5.20000 | 12
| 5.30000 | 2 1
| 5.40000 | 2 1
| 5.50000 | 2 1
| 5.60000 | 2 1
| 5.70000 | 2 1
| 5.80000 | 2 1
| 5.90000 |2 1
| 6.00000 |2 1
| 6.10000 | 2 1
| 6.20000 | 2 1
| 6.30000 | 1 2
Символы, используемые для вывода графиков:
“ 1 ” первая гармоника y = sin(x),
“ 2 ” сумма ряда Фурье – аппроксимация переключательной функции.
Расчет матричной передаточной функции динамической системы
по уравнениям состояния
В головной программе необходимо:
1. описать прототип функции:
void matr_peredat_funkc(int n, int m, int k, int phase_koord, int control, int vyhod, float a[n][n], float b[n][m], float c[k][n], float q[3][n+1]);
2. ввести значение переменной n – количество фазовых координат (размер системы),
3. ввести значение переменной m – количество управлений,
4. ввести значение переменной k – количество выходных переменных
(измерений); если уравнения измерений нет, то k=0,
5. описать массивы:
a[n][n] – матрица динамики системы,
b[n][m] – матрица управления,
с[k][n] – матрица измерений (при необходимости),
q[3][n+1]- матрица коэффициентов передаточной функции
по убыванию степеней:
первая строка - знаменателя передаточной функции,
вторая строка - числителя передаточной функции "фазовая координата/управление",
третья строка - числителя передаточной функции "выходная переменная/управление",
6. ввести массивы a[n][n], b[n][m] и с[k][n] (при необходимости),
7. ввести значения переменных:
phase_koord - номер фазовой координаты,
control - номер управления,
vyhod - номер выходной координаты (измерения) – при необходимости,
8. обратиться к программе вычислений: