![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример выполнения задания и методические указания ⇐ ПредыдущаяСтр 2 из 2
Дано: Решение: По теореме об изменении кинетического момента в проекции на ось z, запишем
где Для получения первой зависимости угловой скорости от времени, когда действуют два момента, умножим левую и правую части выражения (1) на Подставляя значения моментов сил и, внеся момент инерции под знак интеграла, получим
Найти значение определенного интеграла означает вычисление площади под интегральной кривой. В методе трапеций определяют шаг интегрирования и в точках деления вычисляют значения
Рис. 2. Метод трапеций
В программе вычислении интеграла (2) реализуется накоплением конечной суммы Iny, которое происходит в цикле с добавлением площади очередной трапеции с высотой равной шагу h1 и основаниями Y[i], Y[i - 1]:
for(i=1; i< n+1; i++) { Iny[i] = Iny[i - 1] + (Y[i] + Y[i - 1]) / 2 * h1; } где Y[i], Y[i - 1] – элементы массива в котом хранятся значения подынтегрального выражения. Все промежуточные значения угловой скорости на каждом шаге заносим в таблицу результаов вычисления по выражению:
Таблица полученных значений интеграла с переменным верхним пределом служит основой для построения первого графика – разгона тела до угловой скорости
По графику и таблице находим время до остановки тела
на промежутке
Для вычисления трех разных случаев движения используем одну процедуру вычисления интеграла, с тремя исходными функциями, которые по выбору пользователем радио-кнопки вызываются в эту процедуру как параметр-функция. Реализуя данный подход, используем класс языка C#, называемый делегатом. Выражение функции Делегат исполняет роль процедурного типа, когда процедура или функция используется как параметр в другой процедуре. При создании делегата указывается имя метода и набор параметров соответствующих типов. Объявление делегата:
[модификаторы] delegate < тип> < имя> (< параметры>);
где [модификаторы] – модификаторы доступа к делегату (как правило public), < имя> - уникальный идентификатор, < тип> - тип возвращаемого результата, < параметры> - формальные параметры вызова.
Например: public delegate Double y(Double x1, Double x2);
Описание экземпляра делегата:
y fx;
Создание экземпляра и инициализация функцией fx1(x1) с помощью умалчиваемого конструктора:
fx = new y(fx1);
Обращение к процедуре с параметром функцией fx (экземпляром делегата):
Integral(a, b, h, fx);
Причем в заголовке процедуры при ее описании используется делегат y:
void Integral(double a1, double b1, double h1, y f) { ... Y[i] = f(T[i], Iny[i-1]); ... }
Функции которые передаются в процедуру Integral посредством экземпляра делегата fx имеют такую же сигнатуру, что и делегат, например для выражения (3): double fx1(Double x1, Double x2) { if (x2 < 300) { return 600 - 15 * x1-2*x1*x1; } else { return 300-30*x1-2*x1*x1; }
Делегат представляет собой разновидность класса: будучи типом он определяет сигнатуру функции. Любая функция, соответствующая этой сигнатуре может использоваться в качестве параметра конструктора класса-делегата при создании экземпляра-делегата: fx = new y(fx1);.
Элементы управления и экранная форма программы:
Рис. 3. Элементы управления в конструкторе проекта.
Текст клиентского кода п рограммы вычисления определённого интеграла с переменным верхним пределом, которая предоставляет пользователю выбор подынтегрального выражения: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D;
namespace WindowsFormsApplicationL4 { public partial class Form1: Form {
//Описание делегата public delegate Double y(Double x1, Double x2); Double a=-10, b=10, h=0.1, w=0; double[] T, Y, Iny; int i, n; Bitmap myBmp, myBmp2; double Mx, My, My1, MaxY1, MaxY, MaxT;
public Form1() { InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) { // Вычисление dataGridView1.Rows.Clear(); a = Convert.ToDouble(textBox1.Text); b = Convert.ToDouble(textBox2.Text); h = Convert.ToDouble(textBox3.Text); w = Convert.ToDouble(textBox4.Text); // Создание экземпляра делегата y fx; fx = null; int s = 0; //MS = new System.MessageBox.messageBox(this); if (this.radioButton1.Checked) s = 1; if (this.radioButton2.Checked) s = 2; if (this.radioButton3.Checked) s = 3; switch (s) { // Использование делегата case 1: fx = new y(fx1); break; case 2: fx = new y(fx2); break; case 3: fx = new y(fx3); break; default: String Str=" Выберите функцию"; //Вывод сообщения MessageBox.Show(Str, " Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
} //Вызов процедуры вычисления интеграла Integral(a, b, h, fx);
}
private void button2_Click(object sender, EventArgs e) { // Выход Close(); } // Процедура вычисления интеграла с переменным верхним //пределом методом тарпеций и заполнение таблицы void Integral(double a1, double b1, double h1, y f) { n = Convert.ToInt32(Math.Abs((b1 - a1) / h1)); Y = new double[n + 1]; T = new double[n + 1]; Iny = new double[n + 1]; T[0] = a1; Y[0] = f(T[0], w); Iny[0] = w;
for (i = 1; i < n + 1; i++) { dataGridView1.Rows.Add(); T[i] = a1 + i * h1; Y[i] = f(T[i], Iny[i-1]);
Iny[i] = Iny[i - 1] + (Y[i] + Y[i - 1]) / 2 * h1; } for (i = 0; i < n + 1; i++) { // Заполнение таблицы
dataGridView1.Rows[i].Cells[0].Value = i; dataGridView1.Rows[i].Cells[1].Value = T[i]; dataGridView1.Rows[i].Cells[2].Value = Y[i]; dataGridView1.Rows[i].Cells[3].Value = Iny[i];
}
} // Функции соответствующие делегату y(x) double fx1(Double x1, Double x2) { if (x2 < 300) { return 600 - 15 * x1-2*x1*x1; } else { return 300-30*x1-2*x1*x1; } } double fx2(Double x1, Double x2) {
return - 2*x1 * x1;
} double fx3(Double x1, Double x2) { if (x2 < 300) { return 600 - 15 * x1; } else { return 300 - 30 * x1; }
}
// Построение private void button3_Click(object sender, EventArgs e) { // Построение графика
int[] yint, y1int, xint; if (T == null || Y == null || Iny == null) return; MaxY = 0; MaxT = 0; MaxY1 = 0; myBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics gr1 = Graphics.FromImage(myBmp); Pen P1 = new Pen(Color.Red, 2); gr1.DrawRectangle(P1, 1, 1, pictureBox1.Width - 2, pictureBox1.Height - 2); for (int i = 0; i < n + 1; i++) { if (System.Math.Abs(Y[i]) > MaxY) { MaxY = System.Math.Abs(Y[i]);; } if (System.Math.Abs(T[i]) > MaxT) { MaxT = System.Math.Abs(T[i]); } if (System.Math.Abs(Iny[i]) > MaxY1) { MaxY1 = System.Math.Abs(Iny[i]); } } My = (pictureBox1.Height) / 2.2 / MaxY; My1 = (pictureBox1.Height) / 2.8 / MaxY1; Mx = (pictureBox1.Width) / 1.2 / MaxT; yint = new int[n + 1]; y1int = new int[n + 1]; xint = new int[n + 1]; for (int i = 0; i < n + 1; i++) { yint[i] = (pictureBox1.Height) / 2 - Convert.ToInt32(Y[i] * My); y1int[i] = (pictureBox1.Height) / 2 - Convert.ToInt32(Iny[i] * My1); xint[i] = 20 + Convert.ToInt32(T[i] * Mx);
} Pen P2 = new Pen(Color.Green, 6); for (int i = 0; i < n; i++) {
gr1.DrawLine(P2, xint[i], yint[i], xint[i + 1], yint[i + 1]); } Pen P3 = new Pen(Color.Brown, 6); for (int i = 0; i < n; i++) {
gr1.DrawLine(P3, xint[i], y1int[i], xint[i + 1], y1int[i + 1]); }
Pen P4 = new Pen(Color.Black, 3); //Стиль линии с наконечниками P4.SetLineCap(LineCap.Flat, LineCap.ArrowAnchor, DashCap.Flat); //Кисть для шрифта на рисунке Brush B2 = new SolidBrush(Color.Black); System.Drawing.Font E = new Font(" time new roman", 14); // Вывод надписей на рисунке gr1.DrawString(" y, Инт.y", E, B2, 30, 0); gr1.DrawString(" t", E, B2, pictureBox1.Width - 20, pictureBox1.Height / 2); gr1.DrawLine(P4, 10, (pictureBox1.Height) / 2, pictureBox1.Width - 10, (pictureBox1.Height) / 2); gr1.DrawLine(P4, 20, (pictureBox1.Height) - 10, 20, 10); pictureBox1.Image = myBmp; legenda();
} void legenda() {// Вывод легенды myBmp2 = new Bitmap(pictureBox2.Width, pictureBox2.Height); Graphics gr1 = Graphics.FromImage(myBmp2); Pen P1 = new Pen(Color.Green, 6); gr1.DrawLine(P1, pictureBox2.Width / 2, 20, pictureBox2.Width - 10, 20); Pen P2 = new Pen(Color.Brown, 6); gr1.DrawLine(P2, pictureBox2.Width / 2, 50, pictureBox2.Width - 10, 50);
Brush B2 = new SolidBrush(Color.Black); System.Drawing.Font E = new Font(" time new roman", 14); gr1.DrawString(" y(t)", E, B2, 7, 7); gr1.DrawString(" Инт.y", E, B2, 7, 37); pictureBox2.Image = myBmp2;
} } }
Результаты выполнения программы представлены на Рис. 4, 5, 6: Рис. 4. Закон изменения угловой скорости на промежутке
Рис. 6. Зависимость угловой скорости
|