Uploaded by Павел Иванов

hrustalev 35302

advertisement
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Санкт-Петербургский государственный политехнический университет»
—
Институт информационных технологий и управления
Кафедра «Компьютерные системы и программные технологии»
КОНТРОЛЬНАЯ Р А Б О Т А
Исследование краевой задачи
по дисциплине «Вычислительная математика»
Выполнил
студент гр. 23501/5
М.С. Хрусталева
Руководитель
проф.
С.М. Устинов
Санкт-Петербург
2014
1
СОДЕРЖАНИЕ
Введение. ................................................................................................................... 3
Описание решения .................................................................................................... 4
Заключение. ............................................................................................................... 7
Список использованной литературы. .................................................................... 10
Введение
2
Маятник массой М, роль стержня которого выполняет пружина с жесткостью К,
совершает сложные колебания относительно положения равновесия.
L – начальная длина пружины,
K – жесткость пружины,
x – удлинение пружины относительно положения равновесия,
Ɵ - угол.
Дифференциальное уравнение движения имеет вид:
Начальные значения:
Известно, что величина K принимает значение из промежутка [36;46].
Оценить значение K по результатам наблюдения за изменением координаты x.
Таблица наблюдений:
t
0
0.4
0.8
1.2
1.6
2.0
2.4
x
0
0.303
-0.465
0.592
-0.409
0.164
0.180
3
Описание решения
Согласно условию, начальная длина пружины задается формулой с интегралом, поэтому
для решения этого интеграла вызывается подпрограмма QUANC8.
Проведем следующую замену переменных: x = z1; x’ = z2; x’’ = z3; Ɵ = z4; Ɵ’ = z5; Ɵ’’ =
z6, после чего получим систему дифференциальных уравнений в нормированном виде:
𝑧5′ = −
𝑔
2
∗ sin(𝑧4 ) −
∗𝑧 ∗𝑧
𝐿 + 𝑧1
𝐿 + 𝑧1 2 5
𝑧4′ = 𝑧5
𝐾
𝑧2′ = − ( ) ∗ 𝑧1 − 𝑔 ∗ (1 − cos(𝑧4 )) + (𝐿 + 𝑧1 ) ∗ 𝑧52
𝑀
𝑧1′ = 𝑧2
{
Далее с помощью подпрограммы RKF45, решающей систему на промежутке [0; 2.4] с
шагом 0.4, получаем вектор значений удлинения пружины относительно положения
равновесия. Используя его и таблицу с экспериментальными значениями, ищем
среднеквадратичный критерий для дискретного случая. Функция, которой он представлен,
зависит от параметра K. Для нахождения оптимального значения коэффициента нужно
воспользоваться подпрограммой FMIN, в которую передаем наш среднеквадратичный
критерий, границы промежутка, в котором находится K, и погрешность. FMIN
минимизирует функцию и на выходе возвращает параметр K.
4
#include "Forsythe.h"
#include<iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const
const
const
Float
Float g = 9.81;
Float M = 1.;
Float EPS = 0.00001;
K;
Float myFunctIntegr1(Float x) //функция для вычисления интеграла для L
{
return (cos(x*x))/0.90452424;
}
Float errest, flag;
int nofun;
float res = 0;
Float L =
Quanc8(myFunctIntegr1, 0, 1, 1.0e-6, res, &errest, &nofun, &flag); //вычисление
значения L
void MyFunc(Float t, Float *y, Float *dy) //система дифференциальных уравнений в
нормированном виде
{
dy[0]
dy[1]
dy[2]
dy[3]
=
=
=
=
y[1];
-K*y[0]/M - g*(1 - cos(y[2])) + (L + y[0])*y[3]*y[3];
y[3];
-g*sin(y[2])/(L + y[0]) - 2*y[1]*y[3]/(L + y[0]);
}
Float averageQuadSumm(Float K) //функция вычисления среднеквадратичного критерия
{
::K = K;
Float y0[] = {0, 0, 0, 4};//начальные значения
Float t = 0;
Float x[] = {0, 0.303, -0.465, 0.592, -0.409, 0.164, 0.180};//экспериментальные
значения удлинения пружины
unsigned char work[6*(4*sizeof(Float)) + sizeof(rkf_inside)];
rkf_inside *p;
rkf myRKF;
myRKF.f = MyFunc;
myRKF.Y = y0;
myRKF.t = t;
myRKF.tout = 0;
myRKF.ae = EPS;
myRKF.re = EPS;
myRKF.neqn = 4;
myRKF.flag = 1;
myRKF.work = work;
p = (rkf_inside *)myRKF.work;
Float tout = 0;
Float summ = 0; //среднеквадратичный критерий
for (int i = 0; i < 7; i++)
{
rkf45(&myRKF);
cout << "tout = " << setw(3) << myRKF.tout <<
myRKF.Y[0] << " x[] = " << setw(5) << x[i] << endl;
" x* = " << setw(9) <<
5
summ += ( (myRKF.Y[0] - x[i]) * (myRKF.Y[0] - x[i]) );
myRKF.tout += 0.4;
}
return summ;
}
int main()
{
Float K = FMin(averageQuadSumm, 36, 46, 0.0001);//жесткость пружины
std::cout << K << '\n';
system("pause");
return 0;
}
6
Заключение
Для оценки влияния на точность результата погрешности исходных данных производится
возмущение коэффициента жесткости пружины и длины маятника на 1% в сторону
уменьшения.
Результаты до возмущения на 1%:
7
Результаты после возмущения на 1% жесткости пружины:
8
Результаты после возмущения на 1% длины маятника:
В итоге получили результаты, отличающиеся от первоначальных от нескольких сотых до
одной десятой при вызове RKF45. А при минимизации коэффициент жесткости пружины
меняется на несколько десятых. Из этого можно заключить, что наша система достаточно
устойчива к малейшим изменениям ее параметров.
9
Список использованной литературы
С.М.Устинов, В.А.Зимницкий. Вычислительная математика. – СПб.: БХВПетербург, 2009. – 336с. – (Учебное пособие.)
Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических
вычислений. – М.: Мир, 1980. – 280с.
10
Download