close

Вход

Забыли?

вход по аккаунту

?

Kursach

код для вставки
Моя первая курсовая работа (первый блин комом)
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ
ФЕДЕРАЦИИ
Сыктывкарский лесной институт (филиал)
федерального государственного бюджетного образовательного
учреждения высшего профессионального образования
«Санкт-Петербургский государственный лесотехнический
университет имени С. М. Кирова»
Кафедра «Информационные системы»
Курсовая работа
По дисциплине: информатика
На тему:Программные вычисления функции затухающих колебаний
Выполнил: Петров Дмитрий Сергеевич,
студент Транспортно-технологического факультета,
1 курса, группы АБ-315, специальность ИСиТ
Проверил: Власов Владимир Сергеевич
Сыктывкар, 2018
Оглавление
Введение ........................................................................................................ 3
Используемые языки и среды разработки............................................. 4
SciLab ......................................................................................................... 4
C++ ............................................................................................................. 4
Методы нахождения максимума и минимума ...................................... 4
Разработка алгоритмов решения ............................................................. 5
Практическое нахождение точек максимума и минимума, а также
средней частоты..................................................................................................... 9
Первый способ (SciLab) ....................................................................... 10
Первый способ (С++) ............................................................................ 13
Алгоритм нахождения средней частоты. ............................................. 16
Второй способ ............................................................................................. 19
Заключение................................................................................................. 24
Список литературы .................................................................................. 25
Введение
Цель работы -Найти точки максимума и минимума на заданном
отрезке функции угасающих гармонических колебаний, расстояние между
ними, а также среднюю частоту.
Задачи работы:
 Обзорспособов нахожденияточек экстремума;
 Описание языков, используемых в программе;
 Разработка алгоритма нахождения максимума и минимума
функции;
 Построение блок-схемы;
 Запись и проверка данного алгоритма;
Объектом
исследования
является
функция
гармонических
затухающих колебаний.
Предмет исследования – точки экстремума данной функции.
3
Используемые языки и среды разработки
SciLab
Существует множество языков и систем программирования. Некоторые
из них, такие как SciLabили MatLab, специализированы для решения
научных задач, поэтому в данной работе разработкапрограммы будет вестись
в одной из таких сред -SciLab. Она бесплатна, свободно распространяется, а
также у неё есть собственный язык программирования(sci).
Scilabпредставляет собой систему компьютерной математики, которая
предназначена для выполнения инженерных и научных вычислений, таких
как:
• решение нелинейных уравнений и систем;
• решение задач линейной алгебры;
• решение задач оптимизации;
• дифференцирование и интегрирование;
•обработка
экспериментальных
данных
(интерполяция
и
аппроксимация, метод наименьших квадратов);
• решение обыкновенных дифференциальных уравнений и систем.
Помимо описанного выше,SciLab предоставляет широкие возможности
по созданию и редактированию различных видов графиков и
поверхностей.Это очень гибкая система, позволяющая создать любую новую
команду или функцию, а затем использовать ее наравне со встроенными.
C++
Кроме SciLab также будем работать с языком C++.Онактуален и прост
в освоении. Однако здесь нет удобных встроенных функций языка sci, таких
как plot для построения графика, будет присутствовать необходимость
объявлять тип данных для переменных и подключить следующие
библиотеки:
 iostream – для возможности ввода и вывода с помощью
операторов cin иcout соответственно;
 cstdlib–для возможности использовать функцию “system”;
 cmath – для возможности использовать такие функции, как “cos”,
“exp” и др;
 vector – для возможности создания вектора.
Методы нахождения максимума и минимума
Приведённые ниже методы относятся к функции R(x) зависящей от
одной переменной.
4
R(x) → min/max; а ≤ х ≤ b,
где х – скаляр, а и b – соответственно минимальное и максимальное
возможные значения переменной х.
Метод сканирования
Метод заключается в последовательном переборе всех значений а ≤ х ≤
b с шагом ε (погрешность решения) с вычислением значения R(х) в каждой
точке. Путем выбора наибольшего из всех вычисленных значений R и
находится решение задачи.
Метод поразрядного поиска
Данные метод является модификацией метода сканирования. На
первом этапе сканирование осуществляют с крупным шагом, затем отрезок,
внутри которого получено наибольшее значение R(x), разбивается на более
мелкие отрезки, ищется новый отрезок, внутри которого находится
уточненное значение максимума. Он (новый отрезок) опять делится на более
мелкие и т.д., до тех пор, пока величина отрезка, содержащего максимальное
значение R(x), не будет меньше заданной погрешности.
Метод дихотомии (половинного деления)
Метод основан на делении текущего отрезка [а, b], где содержится
искомый экстремум, на две равные части с последующим выбором одной из
половин, в которой локализуется минимум (максимум) в качестве
следующего текущего отрезка. Экстремум локализуется путем сравнения
двух значений критерия оптимальности в точках, отстоящих от середины
отрезка на ε/2.
Метод золотого сечения
Метод основан на делении текущего отрезка [а, b] на две неравные
частидля определения следующего отрезка, содержащего минимум
(максимум).Золотое сечение определяется по правилу: отношение всего
отрезка к большей его части равно отношению большей части отрезка к
меньшей. Ему удовлетворяют две точки c и d, расположенные симметрично
относительно середины отрезка.Путем сравнения R(c) и R(d) определяют
следующий отрезок, где содержится максимум.Новый отрезок снова делится
на неравные части по правилу золотого сечения.Условие окончания поиска –
величина отрезка, содержащего максимум, меньше заданной погрешности.
Это не все существующие методы нахождения точек экстремума. И
хоть они просты и проверены на практике, мной они не будут использованы.
В данной работе будет представлено иные варианты.
Разработка алгоритмов решения
Для начала определим, что такое функция. Функция - это переменная
величина, меняющаяся в зависимости от изменений другой величины;
5
каждому значению аргумента соответствует определённое значение
функции. Так как график строится по точкам, чем меньше расстояние между
ними, тем более чётким и красивым он будет. Поэтому расстояние между
ними примем за 0.01, а максимальное значение – 2.6. Всего получится 261
элемент.
Для нахождения точек максимума и минимума функции используем
два алгоритма. В первом будет работа с целым массивом значений, во втором
этот же массив будет урезаться после каждого найденного экстремума.
Первый случай.
Для него на 8 странице будет описана блок-схема.
Начальный этап. Ввод данных, вычисление значений функции.
Основной этап.
Шаг 1. Определяем поведение функции (убывает/возрастает) в
обратную сторону, так как проверять значения массива будем с конца.
Делается это так, потому что цикл, в котором проверяются значения, условно
разделён на два блока. В первом происходит поиск точки максимума, во
втором точки минимума. Пока работает один, не может работать другой.
Определив поведение функции, программа поймёт, какой блок нужно
запустить первым.
Шаг 2.Непосредственно сам поиск. Создаём цикл, в котором исследуем
массив значений “y”. То значение, после которого следующие перестают
увеличиваться и начинают уменьшаться, будет являться точкой максимума
функции. Аналогично для поиска точки минимума.
Так как количество элементов в массивах переменных “y” и “x”
совпадает, помимо записи значений “y” в отдельный массив, будет
проводиться запись индексов данных значений в ещё один массив. Таким
образом, получится 2 массива. Первый будет отвечать за координату “y”,
второй за координату “x”.
Шаг 3. Строим график и выводим найденные значения.
Второй случай.
Данный способ будет рассмотрен только в среде SciLab.
Начальный этап. Ввод данных, вычисление значений функции.
Основной этап.
Шаг 1. Создадим цикл, в котором будем исследовать массив значений
“y”. Введём два массива: первый - для точек максимума, второй – для точек
минимума. Каждый новый круг будем присваивать значения функции maxи
min. После присваивания будет запускаться ещё один цикл (для каждого
экстремума), в котором производится поиск элемента, который равен
найденному выше значению минимума (или максимума), в массиве “y”. Как
6
только этот элемент найден, все значения после него записываются в
отдельный массив, очищается основной и перезаписывается теми
значениями, которые были вынесены. Таким образом, отрезается часть до
ближайшей точки экстремума, начинается поиск следующей и так пока они
не начнут повторяться. На этом будет произведён выход из цикла.
Шаг 2. Создадим ещё один отдельный цикл, в котором будем
сравнивать значения массива “y” с найденными максимальными и
минимальными значениями. При нахождении соответствия выпишем индекс
значения “y” в отдельный массив. Это будет являться координатой точки
экстремума.
Шаг 3. Строим график и выводим найденные значения.
Для нахождения средней частоты воспользуемся преобразованием
Фурье. В SciLabприсутствует функция быстрого преобразования fft.
Начальный этап. Ввод данных, вычисление значений функции.
Основной этап.
Шаг 1.Произведём преобразование Фурье с помощью функции fft.
Шаг 2.Далее с помощью перечисленных выше способов найдём
вторую точку максимума.
Шаг 3. Подставим найденное значение в формулу:

=
∙ ,

где Xmax–максимальное значение координаты “x”, max–найденное во
втором шаге значение.
Шаг 4.Строим график и выводим найденные значения.
7
Начало
Ввод
данных
Заполняем массивы “x” и “y”, L–длина массива “y”
Да
y(L)<y(L+1)
Нет
К=false
К=true
Циклi
от L до 1
K=true,y(i)<y(i+1)
K=false
y(i)>y(i+1)
K=false;
massive1(j)=y(i+1);
massive2(j)=i+1;
j=j+1;
K=true;
massive1(j)=y(i+1);
massive2(j)=i+1;
j=j+1;
Уменьшить
iна 1
Цикл i
Вывод massive1 и
massive2
Конец
Начало
8
Ввод
данных
Заполняем массивы “x”, “y”, “z”. Lz–длина массива “z”
Цикл i
от 1 до Lz
Нет
z(i)>z(i-1)и i>1
Да
Len=Lz/2
Заполняем
новый
массив“z1” значениями
“y”, начиная от iи
заканчивая Len.
Находим максимальное значение в массиве
“z1”. Запишем его в переменную ma.
Увеличить
iна 1
Цикл i
W=(1/Xmax)*ma
Вывод W
Практическое нахождение точек максимумаи
Конец
минимума, а также средней частоты
Вводимые с клавиатуры значения: α = 1, β = 1, А = 2, Xmax = 2.6.
9
Первый способ (SciLab)
Записываем функцию fun, которая вычисляет значения “y”:
functiondy=fun(alpha,b,A,x)
dy=exp(-x).*cos(((1-exp(b.*x)).*A).*x+alpha)
endfunction
Вводим данные с клавиатуры:
disp('Write Alpha');
alpha=input('a=');
disp('Write Beta');
b=input('b=');
disp('Write A');
A=input('A=');
disp('Write Xmax');
xmax=input('Xmax=');
Заполняем массив координаты “x”:
x=0:0.01:xmax;
Заполняем массив координаты “y” с помощью функции fun:
y=fun(alpha,b,A,x);
Находим предпоследний элемент массива:
l=length(y);//Запоминаем длину массива
l=l-1;
Строим и подписываем график:
plot(x,y);
xtitle('График затухающих колебаний','КоординатаX','Координата Y');
j=1;
Узнаём поведение функции (убывает/возрастает) в обратную сторону:
if (y(l)<y(l+1)) then//Если функция убывает
k=%t;
end
if (y(l)>y(l+1)) then//Если функция возрастает
k=%f;
end
Начинаем бегать по циклу от конца до начала:
fori=l:-1:1
10
Условно делим действия в цикле на два блока:
Первый ищет координаты минимума
if (y(i)>y(i+1) &&k == %f) then
k = %t;
massive1(j)=y(i+1);
massive2(j)=i+1;
j=j+1;
end
Второйищеткоординатымаксимума
if (y(i)<y(i+1) &&k == %t) then
k = %f;
massive1(j)=y(i+1);
massive2(j)=i+1;
j=j+1;
endendend
Переменная “k” не даёт действовать одному блоку, пока работает
другой.
Выводим найденные значения:
l=length(massive1);//Запоминаем длину массива
l=l-1;
fori=l:-1:1
if (massive1(i+1)>massive1(i)) then
disp('Точка минимума: x=');
disp(massive2(i)/100);
disp('y=');
disp(massive1(i));
if (i-1<>0) then
distanc=(massive2(i-1)/100)-(massive2(i)/100);
disp('Расстояние до ближайшего экстремума: ');
disp(distanc);
end
if ((i-1)==0) then
disp('Это была последняя точка экстремума.');
end
end
if (massive1(i+1)<massive1(i)) then
disp('Точка максимума: x=');
11
disp(massive2(i)/100);
disp('y=');
disp(massive1(i));
if (i-1<>0) then
distanc=(massive2(i-1)/100)-(massive2(i)/100);
disp('Расстояние до ближайшего экстремума: ');
disp(distanc);
end
if ((i-1)==0) then
disp('Это была последняя точка экстремума. ');
end
endend
Результат работы программы:
Точка максимума: x= 0.52
y= 0.5697461
Расстояние до ближайшего экстремума: 0.55
Точка минимума: x= 1.07
y= -0.3429448
Расстояние до ближайшего экстремума: 0.26
…
Точка максимума: x= 2.6
y= 0.0749704
Это была последняя точка экстремума.
График:
12
Первый способ (С++)
Подключаем библиотеки:
#include<iostream>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;
Записываемфункциюfunction, котораявычисляетзначения “y”:
float function(float Alph, float Bet,float A1,float x1){
floatdy;
dy=exp(-x1)*cos(((1-exp(Bet*x1))*A1)*x1+Alph);
returndy;
}
intmain(){
system("chcp 1251");//Включаем кириллицу в консоли
system("cls");//Очищаем экран
Объявляем переменные:
13
float Alpha, Beta, A, Xmax, step = 0;
vector<float> massivemin,massivemax,massive2;
Вводим данные с клавиатуры:
cout<<"Введитеальфа: ";
cin>>Alpha;
cout<<"Введите бета: ";
cin>>Beta;
cout<<"Введите А: ";
cin>>A;
cout<<"ВведитеXmax: ";
cin>>Xmax;
intNumber = (Xmax/0.01)+1;//Вычисляем размер динамического массива
float *X = newfloat[Number+1];//Выделяемпамять
float *y = new float[Number];
for (inti = 1; i<=Number+1; i++){//Заполняеммассивпеременной“x”
X[i] = step;
step = step + 0.01; }
Заполняеммассивкоординаты “y” спомощьюфункцииfunction:
for (inti = 0; i<=Number; i++){
y[i]=function(Alpha,Beta,A,X[i]); }
Узнаём поведение функции (убывает/возрастает) в обратную сторону:
bool k;
if (y[Number-1]<y[Number]){//Еслифункцияубывает
k=true;}
if (y[Number-1]>y[Number]){//Еслифункциявозрастает
k=false;}
int j = 0;
intlengthmin= 0,lengthmax=0;
Создаём цикл и разделяем его тело на два блока:
for (inti = Number; i>0; i--){
if (y[i]>y[i+1] && k == false){
k = true;
massivemin.push_back(y[i+1]);
massive2.push_back(i+1);
lengthmin++;//Считаемколичествоэлементов
j++; }
14
if (y[i]<y[i+1] && k == true){
k = false;
massivemax.push_back(y[i+1]);
massive2.push_back(i+1);
lengthmax++;//Считаем количество элементов
j++; }
}
lengthmin = lengthmin-1;
lengthmax = lengthmax-1;
inti=j-1;
Выводим полученные значения:
do{
if(lengthmin>=0){
cout<<"Точкаминимума["<<massive2[i]/100<<";"<<massivemin[l
engthmin]<<"]"<<endl;
if ((i-1) > 0){
cout<<"Расстояниедоближайшегоэкстремума: "<<(massive2[i1]/100)-(massive2[i]/100)<<endl; }
if ((i-1) <= 0){
cout<<"Это была последняя точка минимума"<<endl; }
i--;
}
if(lengthmax>=0){
cout<<"Точкамаксимума["<<massive2[i]/100<<";"<<massivemax
[lengthmax]<<"]"<<endl;
if ((i-1) > 0){
cout<<"Расстояниедоближайшегоэкстремума: "<<(massive2[i1]/100)-(massive2[i]/100)<<endl; }
if ((i-1) <= 0){
cout<<"Это была последняя точка максимума"<<endl; }
i--;
}
lengthmin--;
lengthmax--;
Цикл завершится, когда номер элемента станет равным -1. Не 0, потому
что номер уменьшается уже после выполнения действий. Таким образом,
если записать «(lengthmin>=0) && (lengthmax>=0)», то последние две точки
не будут выведены на экран. Поэтому пишем:
15
}while ((lengthmin>=-1) && (lengthmax>=-1));
Очищаем память:
delete [] X;
delete [] y;
system("pause");//Задержка экрана на консоли
return 0;//Выходим из программы
}
Результат работы программы:
Алгоритм нахождения средней частоты.
Запишем функцию:
functiondz=func(y)
16
dz=abs(fft(y));
endfunction
Передадим ей значения “y”:
z=func(y);
Построим график:
plot(z);
lz=length(z);
i=1;
whilei<lz
Нашли первую точку минимума:
if ((i>1) && (z(i)>z(i-1))) then
len=lz/2;
Приводим к целому значению, чтобы можно было создать цикл,
записывающий до этого значения:
len1=int(len);
Записываем все значения после точки минимума в другой массив:
forj=1:1:len1
z1(j)=z(i);
i=i+1;
end
В нём находим нужное нам значение с помощью функции «max»:
ma=max(z1);
Останавливаем цикл, чтобы не заставлять программу работать дальше:
break;
end
i=i+1;
end
Находимсреднюючастоту и выводим её:
deltaW=1/xmax;
w=deltaW*ma;
disp("Средняячастота: ");
disp(w);
17
Для того, чтобы графики не накладывались друг на друга, можно
удалить данные строчки, либо же сделать их комментариями:
plot(x,y);
xtitle();
->//plot(x,y);
->//xtitle();
Результат:
Средняя частота: 4.9277871
График:
18
Второй способ
Записываем функцию fun, которая вычисляет значения “y”:
functiondy=fun(alpha,b,A,x)
dy=exp(-x).*cos(((1-exp(b.*x)).*A).*x+alpha)
endfunction
Вводим данные с клавиатуры:
disp('WriteAlpha');
alpha=input('a=');
disp('Write Beta');
b=input('b=');
disp('Write A');
A=input('A=');
xmax=input('Xmax=');
Заполняем массив координаты “х”:
x=0:0.01:xmax;
Заполняем массив координаты “y” с помощью функции fun:
y=fun(alpha,b,A,x);
l=length(y);//Запоминаем длину
Строим и подписываем график:
plot(x,y);
xtitle('График затухающих колебаний','КоординатаX','Координата Y');
i=1;//Начинаем бегать по циклу с первого элемента
whilei<l
Находим точку максимума и фиксируем её значение по “y”:
ma(i)=max(y);
Если точка максимума повторяется, значит, цикл нужно завершить:
if ((i>1) && (ma(i)==ma(i-1))) then
break;
end
forj=1:1:l
Находим индекс точки максимума в массиве “y”:
if (y(j)==ma(i)) then
19
q=1;
Записываем следующие за ней значения в отдельный массив:
fork = j:1:l
y1(q)=y(k);
q=q+1;
end
Очищаем основной:
cleary;
w=1;
q=length(y1);//Запоминаем длину нового массива
Перезаписываем значения, начиная с точки максимума:
for k = 1:1:q
y(w)=y1(k);
w=w+1;
end
l=length(y);//Запоминаем длину главного массива
Очищаем дополнительный массив:
cleary1;
Останавливаем цикл:
break;
end
end
Аналогичносточкойминимума. Находим точку минимума и фиксируем
её значение по “y”:
mi(i)=min(y);
Если точка минимума повторяется, значит цикл нужно завершить:
if ((i>1) && (mi(i)==mi(i-1))) then
break;
end
forj=1:1:l
20
Находим её индекс в массиве “y”:
if (y(j)==mi(i)) then
q=1;
Записываем следующие за ней значения в отдельный массив:
for k = j:1:l
y1(q)=y(k);
q=q+1;
end
Очищаем основной массив:
cleary;
w=1;
q=length(y1);//Запоминаем длину нового массива
Перезаписываем значения, начиная с точки минимума:
for k = 1:1:q
y(w)=y1(k);
w=w+1;
end
Очищаем дополнительный массив:
cleary1;
l=length(y);//Запоминаем длину главного массива
Останавливаемцикл:
break;
end
end
i=i+1;
end
Как выглядит цикл поиска значений “x”:
forg=1:1:L
if (y(g)==mi(a)) then//Нашли значение в массиве “y”
massmin(a)=g;//Записали отдельно его индекс
a=a+1;
if (a==m) then//Если последний проверяемый элемент был последним
q=%t;
21
end
end
if ((w==%t) && (q==%t)) then//Останавливаем цикл, если найдены все
значения “x”
break
end
if (y(g)==ma(b)) then//Нашли значение в массиве “y”
massmax(b)=g;//Записали отдельно его индекс
b=b+1;
if (b==k) then//Если последний проверяемый элемент был последним
w=%t;
end
end
if ((w==%t) && (q==%t)) then //Останавливаем цикл, если найдены все
значения “x”
break
end
end
Выводим результат:
p=i-1;
q=1;
w=1;
for j=1:1:p
if (ma(j)<>y(l)&& (q<>b)) then
disp('Точка максимума: x=');
v=massmax(q);
q=q+1;
disp(x(v));
disp('y=');
disp(ma(j));
if (j<>p) then
distanc=(massmin(j)/100)-(massmax(j)/100);
disp('Расстояние до ближайшего экстремума: ');
disp(distanc);
end
if ((j)==p) then
disp('Это была последняя точка максимума: ');
22
end
end
if (mi(j)<>y(l)&& (w<>a)) then
disp('Точка минимума: x=');
c=massmin(w);
w=w+1;
disp(x(c));
disp('y=');
disp(mi(j));
if (j<>p) then
distanc=(massmin(j)/100)-(massmax(j)/100);
disp('Расстояние до ближайшего экстремума: ');
disp(distanc);
end
if ((j)==p) then
disp('Это была последняя точка минимума: ');
end
endend
Результат работы программы:
Точка максимума: x= 0.52
y= 0.5697461
Расстояние до ближайшего экстремума: 0.55
Точка минимума: x= 1.07
y= -0.3429448
Расстояние до ближайшего экстремума: 0.26
…
Точка максимума: x= 2.6
y= 0.0749704
Это была последняя точка максимума.
График выглядит так же, как и в первом способе.
23
Заключение
Основную цель данной курсовой работы можно считать
достигнутой.Для
её
достижения
были
разработаны
два
типа
решения.Первоене требует специфических сред для своей реализации,во
второмиспользуются
отдельные
функции
языка
SciLab«min»и
«max».Следствием достижения поставленной цели, является появление
новых перспектив в исследованиях и способах решения подобных задач.
Также можно сделать вывод, что вследствие простоты языка, возможности
строить графики с помощью специальных функций, не требующих долгого
расписывания, встроенных математических функций SciLabявляется более
удобной, и поэтому одной из лидирующих сред для решения подобных задач.
24
Список литературы
1.Математические методы.Методические указания по выполнению
лабораторных работ.Часть 2.[Текст]: учебное пособие.—Северодвинск, 2008.
2. Алексеев Е.Р., Чеснокова О.В., Рудченко Е.А. Scilab: Решение
инженерных и математических задач. [Текст]— Москва: ALT Linux;
БИНОМ. Лаборатория знаний, 2008.— 260 с.
3. Прата, Стивен. Язык программированияС++. Лекции и упражнения.
[Текст]—5-е изд. Пер. с англ. ­Москва.: 000 "И.Д. Вильямс", 2007. - 1 184 с.
25
Автор
N1ghtk1n
Документ
Категория
Без категории
Просмотров
25
Размер файла
267 Кб
Теги
<trening2019>, kursach
1/--страниц
Пожаловаться на содержимое документа