Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Санкт-Петербургский государственный политехнический университет» — Институт информационных технологий и управления Кафедра «Компьютерные системы и программные технологии» КОНТРОЛЬНАЯ Р А Б О Т А Исследование краевой задачи по дисциплине «Вычислительная математика» Выполнил студент гр. 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