Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример выполнения задания и методические указания






Дано:

Решение:

По теореме об изменении кинетического момента в проекции на ось z, запишем

(1)

где - кинетический момент тела в проекции на ось вращения.

Для получения первой зависимости угловой скорости от времени, когда действуют два момента, умножим левую и правую части выражения (1) на и проинтегрируем на промежутке .

Подставляя значения моментов сил и, внеся момент инерции под знак интеграла, получим

(2)

 

Найти значение определенного интеграла означает вычисление площади под интегральной кривой. В методе трапеций определяют шаг интегрирования и в точках деления вычисляют значения (i=0, …, N) площадь фигуры вычисляют по выражению:

y
a
b
xi-1 xi xi+1
x

Рис. 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] – элементы массива в котом хранятся значения подынтегрального выражения. Все промежуточные значения угловой скорости на каждом шаге заносим в таблицу результаов вычисления по выражению:

(3)

Таблица полученных значений интеграла с переменным верхним пределом служит основой для построения первого графика – разгона тела до угловой скорости . Это конечное значение является начальным условием для второго участка движения, когда тело замедляет вращение под действием только момента :

(4)

 

(5)

 

По графику и таблице находим время до остановки тела . Уточняем диапазон построения для второго графика и пересчитываем значения интеграла (5) на промежутке . Третий график строим для случая отсутствия сопротивления:

(6)

 

(7)

на промежутке .

 

Для вычисления трех разных случаев движения используем одну процедуру вычисления интеграла, с тремя исходными функциями, которые по выбору пользователем радио-кнопки вызываются в эту процедуру как параметр-функция. Реализуя данный подход, используем класс языка 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. Закон изменения угловой скорости на промежутке .

 

Рис. 5. Закон изменения угловой скорости от до момента остановки .

 

Рис. 6. Зависимость угловой скорости от времени от до момента при отсутствии момента сил сопротивления .






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.