close

Вход

Забыли?

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

?

ЛР1 МПИ

код для вставкиСкачать
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
"Ижевский государственный технический университет имени М.Т.Калашникова"
Факультет "Информатика и вычислительная техника"
Кафедра "Программная инженерия"
Отчет по лабораторным работам №1,2
по дисциплине: Методология программной инженерии
Выполнили:
магистранты группы М-01-191-1
Ивашкин Д.Ю.,
Шабров А.Н.
Проверил:
д.т.н, профессор
Ложкин А.Г.
Ижевск 2013
Постановка задачи
Написать программу по нахождению корня уравнения на промежутке с точностью до 0,01. Вывести график функции и точки приближения, количество итераций, значение корня.
Вариант 28:
1) Уравнение 2x3-11x2-7x+41;
2) Промежуток [1,3];
3) Рассчет методом Ньютона.
Описание метода Ньютона
Метод Ньютона, алгоритм Ньютона (также известный как метод касательных) - это итерационный численный метод нахождения корня (нуля) заданной функции. Алгоритм:
* задается начальное приближение;
* пока не выполнено условие остановки, в качестве которого можно взять или (то есть погрешность в нужных пределах), вычисляют новое приближение: .
В варианте 28 функция f(x) = 2x3-11x2-7x+41. Её первая производная будет соответственно f '(x)=6x2-22x-7.
Контрольный пример
На рисунке 1 изображен график функции f(x) на промежуткке [1,4] и итерации метода. На 2 итерации был найден корень с точностью 0,01 и он равен ~1,96.
Рис.1. Результат работы программы на отрезке [1,4]
На рисунке 2 показано вычисление корня на отрезке [-5,10]. Видно, что на этом отрезке функция имеет 2 корня. В данном случае метод вычислил корень ~5,45 за 4 итерации.
Рис.2. Результат работы программы на отрезке [-5,10]
Текст программы
Модуль Form1.cs:
/* ==========
Модуль обработчиков системных вызовов окна Form1.cs;
В данном модуле описан класс окна, а также обработчики некоторых системных вызовов при его загрузке.
==========
*/
/* Подключение стандартных библиотек языка C#:
System - глобальный модуль, в котором содержатся описания всех объектов языка;
System.Windows.Forms - модуль для работы с окнами;
*/
using System;
using System.Windows.Forms;
namespace MPI_LR1
{
// Описание класса окна
public partial class mainWindow : Form
{
/* Процедура mainWindow осуществляет начальную загрузку окна и вывод его на экран с помощью системного вызова InitializeComponent().
Вызывается автоматически после запуска программы
*/
public mainWindow()
{
InitializeComponent();
}
// Процедура-событие AcceptButton_Click выполняется после нажатия в окне на кнопку "Вычисление"
// Выполняет запуск вычисления и рисования графика функции посредством процедуры processDataAndDraw модуля ProcessClass.
private void AcceptButton_Click(object sender, EventArgs e)
{
// Очистим окно с итерациями, полотно и вычислим новые и нарисуем график
iterList.Items.Clear();
zedGraph.GraphPane.CurveList.Clear();
ProcessClass.processDataAndDraw();
}
// Процедура-событие onWindowLoad выполняется после полной загрузки окна программы автоматически.
// Выполняет начальную настройку области графика, а именно изменяет названия осей и легенды графика
// Используется компонент ZedGraphControl библиотеки ZedGraph для представления графика в окне
private void onWindowLoad(object sender, EventArgs e)
{
// Зададим названия осей и легенды графика
zedGraph.GraphPane.XAxis.Title.Text = "Ось X";
zedGraph.GraphPane.YAxis.Title.Text = "Ось Y";
zedGraph.GraphPane.Title.Text = "График функции f(x) = 2x^3-11x^2-7x+41";
}
}
}
Модуль InputClass.cs:
/* ==========
Модуль ввода данных InputClass.cs;
В данном модуле описаны методы для ввода данных от пользователя
==========
*/
/* Подключение стандартных библиотек класса C#:
System - глобальный модуль, в котором содержатся описания всех объектов языка;
System.Text - модуль для работы с текстовыми данными;
*/
using System;
using System.Text;
namespace MPI_LR1
{
static class InputClass
{
/*
Функция getLeftOrder берет число которое ввел пользователь в первой текстовой строке и возвращает его;
*/
public static double getLeftOrder()
{
// Пробуем считать из текстового поля строку как переменную типа Double
double LeftOrder_Double;
try
{
LeftOrder_Double = System.Convert.ToDouble(Program.MainWindow.LeftOrder.Text);
}
// В случае неудачи выдаем сообщение пользователю на экран и принимаем значение левой границы по умолчанию равное -5
catch
{
OutputClass.showMessage("Неверно введена левая граница");
LeftOrder_Double = -5.0;
}
return LeftOrder_Double;
}
/*
Функция getRightOrder берет число которое ввел пользователь во второй текстовой строке и возвращает его;
*/
public static double getRightOrder()
{
// Пробуем считать из текстового поля строку как переменную типа Double
double RightOrder_Double;
try
{
RightOrder_Double = System.Convert.ToDouble(Program.MainWindow.RightOrder.Text);
}
// В случае неудачи выдаем сообщение пользователю на экран и принимаем значение правой границы по умолчанию равное 5
catch
{
OutputClass.showMessage("Неверно введена правая граница");
RightOrder_Double = 5.0;
}
return RightOrder_Double;
}
}
}
Модуль ProcessClass.cs:
/* ==========
Модуль обработки данных ProcessClass.cs;
В данном модуле описаны методы для обработки информации в программе
==========
*/
// Подключение стандартной библиотеки языка C#: System - глобальный модуль, в котором содержатся описания всех объектов языка;
using System;
namespace MPI_LR1
{
static class ProcessClass
{
/*
Функция funcDouble вычисляет значение заданной функции f(x) = 2x^3-11x^2-7x+41 и возвращает это значение;
Параметры функции:
XCoor_Double - координата по оси X.
*/
public static double funcDouble(double XCoor_Double)
{
return (2 * XCoor_Double * XCoor_Double * XCoor_Double - 11 * XCoor_Double * XCoor_Double - 7 * XCoor_Double + 41);
}
/*
Функция funcDiffDouble вычисляет значение производной функции f(x) = 2x^3-11x^2-7x+41 и возвращает это значение;
Используется функция f'(x) = 6x^2-22x-7 как производная для f(x) = 2x^3-11x^2-7x+41.
Параметры функции:
XCoor_Double - координата по оси X.
*/
public static double funcDiffDouble(double XCoor_Double)
{
return (6 * XCoor_Double * XCoor_Double - 22 * XCoor_Double - 7);
}
/*
Процедура processDataAndDraw выполняет вычисление корня функции методом Ньютона
*/
public static void processDataAndDraw()
{
/* Объявляем переменные:
- Eps_Double - точность которую нужно достигнуть при вычислении;
- XPrev_Double - координата по оси Х на предыдущей итерации метода;
- XCurrent_Double - координата по оси Х на текущей итерации метода.
*/
const double Eps_Double = 0.01;
// Берем середину отрезка
double XPrev_Double, XCurrent_Double = (InputClass.getRightOrder() - InputClass.getLeftOrder())/2.0;
int IterationCount_Int = 0;
// Выполняем поиск корня методом Ньютона в цикле пока не достигнем точности Eps_Double
do
{
XPrev_Double = XCurrent_Double;
XCurrent_Double = XPrev_Double - funcDouble(XPrev_Double) / funcDiffDouble(XPrev_Double);
OutputClass.addIterationToList(IterationCount_Int, XCurrent_Double);
// Подсчитываем количество совершенных итераций
IterationCount_Int++;
}
while (Math.Abs(XCurrent_Double - XPrev_Double) > Eps_Double);
// Выводим найденный корень и количество итераций
OutputClass.addLogMessage("==============================");
OutputClass.addLogMessage("Корень функции: " + XCurrent_Double);
OutputClass.addLogMessage("Количество итераций: " + IterationCount_Int);
OutputClass.addLogMessage("==============================");
// Рисуем график функции на заданном отрезке
OutputClass.drawGraph(InputClass.getLeftOrder(), InputClass.getRightOrder());
}
}
}
Модуль OutputClass.cs:
/* ==========
Модуль вывода данных OutputClass.cs;
В данном модуле описаны методы для вывода данных программы на экран
==========
*/
/* Подключение стандартных библиотек языка C#:
System - глобальный модуль, в котором содержатся описания всех объектов языка;
System.Windows.Forms - модуль для работы с окнами;
System.Drawing - модуль поддержки графики и рисования;
*/
using System;
using System.Windows.Forms;
using System.Drawing;
/*
Подключение нестандартной библиотеки ZedGraph - для рисования графика.
ZedGraph это библиотека классов пользовательского интерфейса для C# для рисования 2D линий, графов, гистрограмм и.т.д.
Распространяется свободно по лицензии GNU GPL.
*/
using ZedGraph;
namespace MPI_LR1
{
static class OutputClass
{
/*
Процедура drawGraph осуществляет рисование графика функции f(x) = 2x^3-11x^2-7x+41 на заданном промежутке.
Параметры процедуры:
- XCoorBegin_Double - левая координата по оси Х, с которой начинать рисовать график функции;
- XCoorEnd_Double - правая координата по оси Х, до которой рисовать график функции;
В процедуре используется библиотека ZedGraph, а именно:
- Процедура AddCurve(string label, PointPairList list, Color color, SymbolType symbolType) - добавляет кривую на полотно;
- Процедура AxisChange() - обновляет данные полотна ZedGraph в буффере рисования;
- Процедура Invalidate() - применяет буффер рисования на экран;
*/
public static void drawGraph(double XCoorBegin_Double, double XCoorEnd_Double)
{
// Создаем массив pointList_PointPairList для хранения точек графика функции;
// Затем в цикле от левой до правой границы с шагом в 0,01 по оси Х заполним массив значениями функции f(x).
PointPairList pointList_PointPairList = new PointPairList();
for (double x = XCoorBegin_Double; x <= XCoorEnd_Double; x += 0.01)
pointList_PointPairList.Add(x, ProcessClass.funcDouble(x));
// Добавляем кривую с пустым названием, с заданными точками зеленым цветом в буффер полотна.
Program.MainWindow.zedGraph.GraphPane.AddCurve("", pointList_PointPairList, Color.Green, SymbolType.None);
// Обновим буффер и применим изменения на экран
Program.MainWindow.zedGraph.AxisChange();
Program.MainWindow.zedGraph.Invalidate();
}
/*
Процедура addIterationToList добавляет в список в окне очередное значение итерации.
Параметры процедуры:
IterationValueX_Double - значение по оси Х на итерации;
IterationIndex_Int - порядковый номер итерации.
*/
public static void addIterationToList(int IterationIndex_Int, double IterationValueX_Double)
{
// Добавляем итерацию в список и сдвинем ползунок вниз (в случае переполнения списка)
Program.MainWindow.iterList.Items.Add((IterationIndex_Int+1)+") "+IterationValueX_Double);
Program.MainWindow.iterList.TopIndex = Program.MainWindow.iterList.Items.Count - 1;
}
/*
Процедура showMessage выводит сообщение на экран. Вызывается стандартная процедура модуля System.Windows.Forms.MessageBox.Show, создающая диалоговое окно
Параметры:
Message_String - строка сообщения.
*/
public static void showMessage(string Message_String)
{
MessageBox.Show(Message_String);
}
/*
Процедура addLogMessage выполняет добавление сообщения в лог.
Параметры:
Message_String - строка сообщение.
*/
public static void addLogMessage(string Message_String)
{
// Добавляем сообщение в список и сдвинем ползунок вниз (в случае переполнения списка)
Program.MainWindow.iterList.Items.Add(Message_String);
Program.MainWindow.iterList.TopIndex = Program.MainWindow.iterList.Items.Count - 1;
}
}
}
Документ
Категория
Рефераты
Просмотров
89
Размер файла
182 Кб
Теги
лр1, мпи
1/--страниц
Пожаловаться на содержимое документа