Программа решения уравнения методом половинного деления
Создание программы решения уравнения методом половинного деления. Разработка алгоритма решения поставленной задачи и программы на языке Си. Абсолютная и относительная погрешности вычислений. Тестирование программы. Руководство пользователя по работе.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.11.2016 |
Размер файла | 686,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство науки и образования Российской Федерации
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра радиоэлектроники и защиты информации (РЗИ)
Курсовая работа на тему
«Программа решения уравнения методом половинного деления»
Выполнил: студент 1А2 группы
Леконцев Д.Р.
Проверил: аспирант кафедры РЗИ
Чечулин С.О.
Томск 2013
Оглавление
1. Цель работы
2. Задание
3. Исходные данные
4. Описание метода решения задачи, программы и используемых алгоритмов
4.1 Структура проекта
4.2 Алгоритм работы проекта
4.3 Решение уравнения методом половинного деления
4.4 Точное решение уравнения
4.5 Абсолютная и относительная погрешности вычислений
5. Описание методики тестирования программы
6. Руководство пользователя по работе с программой
7. Блок-схема программы
8. Распечатка текста программы
Выводы по работе
Список используемой литературы
1. Цель работы
Изучить теоретический материал для создания программы решения уравнения методом половинного деления. Разработать алгоритм решения поставленной задачи, разработать программу на языке Си, протестировать созданную программу, устранить ошибки, выявленные на этапе тестирования.
2. Задание
Составить алгоритм решения задачи, отобразить на экране в графическом режиме с учетом масштабирования процесс вычисления корня. Выдать на экран точное и приближенное значения корня, погрешность вычисления.
3. Исходные данные
Число уравнений 3
1. ;
2. ;
3.
Коэффициенты a, b, c вещественные числа задаются с клавиатуры. Погрешность вычисления корня, границы интервала поиска корня - вещественные числа, задаются с клавиатуры.
4. Описание метода решения задачи, программы и используемых алгоритмов
программа уравнение половинный деление
4.1 Структура проекта
Проект состоит из файлов:
1. Pol_del.cpp - главный элемент проекта;
2. graphic.cpp - отображение графиков функций
4.2 Алгоритм работы проекта
При запуске программы пользователю предоставляется ввести данные с клавиатуры.
Исходные данные к программе:
gr1 и gr2 - пределы интегрирования (вещественные числа)
a, b, c - коэффициенты в уравнениях (вещественные числа)
n - число делений (натуральное число).
При вводе пользователем данных проверяется их корректность. При обнаружении ошибки, повторяется процесс ввода.
Далее для каждого из 3х уравнений вычисляются и отображаются на экран:
1. Приближенное значение корня, вычисленное методом половинного деления;
2. Точное значение корня;
3. Погрешность вычисления;
Затем отображается выбранный график и процесс вычисления корня.
4.3 Решение уравнения методом половинного деления
Метод половинного деления -- это метод численного решения нелинейных уравнений вида f(x)=0, заключающийся в делении исходного интервала до тех пор пока корень уравнения не будет найден. Идея метода проста: пусть функция непрерывна на отрезке [gr1, gr2] и |gr2-gr1|>eps, делим отрезок [gr1, gr2] пополам. Получим точку x=(gr1+gr2)/2 и два отрезка [gr1, x] и [x, gr2]. Если F(x)=0, то x и есть искомый корень. Если нет, то из двух полученных отрезков [gr1, x] и [x, gr2] надо выбрать такой [gr1', gr2'], что F(gr1')*F(gr2')<0, то есть [gr1', gr2']=[gr1, x], если F(gr1)*F(x)<0 или [gr1', gr2']= [gr1, x], если F(gr2)*F(x)<0. Теперь новый отрезок делим пополам и ищем середину отрезка и так далее. Для того чтобы найти приближенное значение корня с точность eps>0, необходимо остановить процесс половинного деления на шаге n, на котором |gr2-gr1|<eps, и вычислить x=(gr1+gr2)/2. Половина этого отрезка и будет приближенным корнем уравнения.
Исходное уравнение содержится в функции:
F1(float x)
Тогда функция решения уравнения методом половинного деления имеет вид:
while(fabs(gr2-gr1)>eps){
n++;
x=(gr1+gr2)/2;
f1=F1(x);
f2=F1(gr2);
if(fabs(f1)<eps)
{break;}
if (f2*f1<0)
{gr1=x;}
Else
{gr2=x;}
}
x=(gr2+gr1)/2;
Где a, b, c - коэффициенты уравнения, gr1, gr2 - интервал, n - количество делений, eps-точность вычисления корня.
4.4 Точное решение уравнения
Точное решение уравнения вычисляется стандартным способом: для первого уравнения с помощью теоремы Вието-Кардано, а для второго и третьего с помощью выражения корня через коэффициенты уравнения.
4.5 Абсолютная и относительная погрешность вычисления
Абсолютная погрешность вычисления находится как модуль разности между точным и приближенным решением.
А относительной погрешностью приближённого числа называется отношение абсолютной погрешности приближённого числа к самому этому числу в процентном соотношении.
Так в нашем случае
fabs(x - x1)- абсолютная погрешность;
fabs((x-x1)/x1)*100- относительная погрешность.
Где x - приближенное решение уравнения (методом половинного деления), x1 - точное решение уравнения.
5. Описание методики тестирования программы
Протестируем на корректное вычисление корня.
Для первого уравнения:
Как видим погрешность вычислений довольно небольшая, что говорит о том, что программа работает правильно.
Для второго уравнения:
Для третьего уравнения:
Рассмотрим работу программы при некорректном вводе данных:
Неверный выбор вида функции
Попытка ввода символов для численного значения:
Аналогично работает тестирование для остальных численных значений
Попытка ввода не натурального числа делений
Это основные тесты для программы. Программа прошла успешное тестирование, как на корректную работу, так и на корректное вычисление корня.
6. Руководство пользователя по работе с программой
При запуске программы предоставляется выбор одной из трех функций.
При вводе данных необходимо учесть, что:
1. Границы интервала (gr1, gr2) являются вещественными числами;
2. Коэффициенты в уравнениях (a, b, c) являются вещественными числами;
3. Число делений (n_max) - натуральное число.
При нарушении этих требований, программа может закрыться и ввод данных необходимо повторить.
После корректного ввода данных будет отображены для заданных значений:
1. Значение корня, вычисленного методом половинного деления;
2. Точное значение корня;
3. Абсолютная погрешность вычисления;
4. Относительная погрешность вычисления.
Если данная работа была для Вас полезна, то вы можете поблагодарить автора!
Реквизиты Сбербанк:4276 6400 1230 1216
Для связи VK: https://vk.com/red_de
7. Блок-схема программы
8. Распечатка текста программы
Комментарии к файлу хранятся в исходнике.
Pol_del.cpp - главный файл проекта
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <graphics.h>
const int X0=400, Y0=300, k=100;
const float pi=3.14;
int n=0, v, n_max, n1;
float a, b, c, gr1, gr2, eps;
float q, r, Q, R, m, A, B, R1, Q1;
float x, f1, f2, fm, x1, g, s, f, pog, pog1, j, t;
float F1(float x){
return a*x*x*x+b*x+c;
}
float F2(float x){
return a*sin(x+b)+c;
}
float F3(float x){
return a*log(fabs(x+b))+c;
}
float sign(float x){
if(x==0)return 0;
if(x>0) return 1;
else return -1;
}
#include"graphic.cpp"
main() {
setlocale(LC_CTYPE, "Russian");
printf ("Выберите уравнение:\n1)y=a*x*x*x+b*x+c\n2)y=a*sin(x+b)+c\n3)y=a*ln|x+b|+c\nВвод:");
scanf("%d", &v);
switch(v)
{
case 1:break;
case 2:break;
case 3:break;
default:printf("Введен неверное значение! Программа закрывается!\n");
system("pause");
exit(0);
}
fflush(stdin);
printf("Введите точность eps:");
while(!scanf("%f", &eps)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\n Введите точность eps:");
}
if(eps<0||eps==0){
printf("Точность не может быть отрицательной или равной нулю!Программа закрывается!\n");
system("pause");
exit(0);
}
fflush(stdin);
printf("Введите границы:\ngr1=");
while(!scanf("%f", &gr1)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\ngr1=");
}
fflush(stdin);
printf("gr2=");
while(!scanf("%f", &gr2)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\ngr2=");
}
if(gr1>gr2){
s=gr1;
g=gr2;
gr1=g;
gr2=s;
}
g=gr1;
s=gr2;
fflush(stdin);
printf("Введите коэффициенты:\na=");
while(!scanf("%f", &a)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\na=:");
}
fflush(stdin);
printf("b=");
while(!scanf("%f", &b)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\nb=");
}
fflush(stdin);
printf("c=");
while(!scanf("%f", &c)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\nc=:");
}
fflush(stdin);
printf("Введите максимальное число делений:");
while(!scanf("%d", &n_max)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\n Введите максимальное число делений:");
}
if(n_max<0||n_max==0){
printf("Количество делений не может быть вещественным числом или меньше, либо равным нулю!\nПрограмма закрывается!\n");
system("pause");
exit(0);
}
fflush(stdin);
switch(v)
{case 1:
while(fabs(gr2-gr1)>eps){
n++;
x=(gr1+gr2)/2;
f1=F1(x);
f2=F1(gr2);
if(fabs(f1)<eps)
{break;}
if (f2*f1<0)
{gr1=x;}
else
{gr2=x;}
}
if(a==0&&b!=0){
x1=-c/b;
break;
}
if(a!=0){
q=b/a;
r=c/a;
Q=-(3*q)/9;
R=(27*r)/54;
Q1=pow(Q, 3);
R1=pow(R, 2);
if(R1<Q1)
{m=acos(R/sqrt(Q1))/3;
x1=-2*sqrt(Q)*cos(m);
}
if(R1>=Q1)
{A=-sign(R)*pow(fabs(R)+sqrt(R1-Q1), 0.33);
if(A!=0)
{B=Q/A;
}
if(A==0)
{B=0;
}
x1=(A+B);
}
}
if(!((g<=x1)&&(s>=x1))||a==0&&b==0){
printf("В интервале [%.3f;%.3f] корня нет!\n", g, s);
system("pause");
exit(0);
}
x=(gr2+gr1)/2;
fm=F1(x);
break;
case 2:
while(fabs(gr2-gr1)>eps){
n++;
x=(gr1+gr2)/2;
f1=F2(x);
f2=F2(gr2);
if(fabs(f1)<eps)
{break;}
if (f2*f1<0)
{gr1=x;}
else
{gr2=x;}
}
if(c/a>1||c/a<-1){
printf("В интервале [%.3f;%.3f] корня нет!\n", g, s);
system("pause");
exit(0);
}
if(!((g<=x1)&&(s>=x1))||a==0){
printf("В интервале [%.3f;%.3f] корня нет!\n", g, s);
system("pause");
exit(0);
}
x=(gr2+gr1)/2;
for(n1=0;n1<=1000;n1++)
{
j=-asin(c/a)-b-pi*n1;
if(((x-0.03*x)<=j)&&((x+0.03*x)>=j)){
x1=j;
}
}
for(n1=0;n1<=1000;n1++){
j=-asin(c/a)-b+pi*n1;
if(((x-0.03*x)<=j)&&((x+0.03*x)>=j)){
x1=j;
}
}
fm=F2(x);
break;
case 3:
while(fabs(gr2-gr1)>eps){
n++;
x=(gr1+gr2)/2;
f1=F3(x);
f2=F3(gr2);
if(fabs(f1)<eps)
{break;}
if (f2*f1<0)
{gr1=x;}
else
{gr2=x;}
}
x1=pow(M_E, (-c/a))-b;
if(!((g<=x1)&&(s>=x1))||a==0){
printf("В интервале [%.3f;%.3f] корня нет!\n", g, s);
system("pause");
exit(0);
}
if(gr2+b<0){
printf("В интервале [%f;%f] корня нет!\n", g, s);
system("pause");
exit(0);
}
x=(gr2+gr1)/2;
fm=F3(x);
break;
}
pog1=fabs(x-x1);
if(x1>x){
pog=fabs((x-x1)/x1)*100;
}
if(x==0&&x1==0){
pog=0;
}
else{
pog=fabs((x1-x)/x)*100;
}
if(n>n_max){
printf("За %d шаг(ов) корень не найден. Продолжаем?\n1)Да\n2)Нет\nВвод:", n_max);
while(!scanf("%d", &t)){
while(getchar() != '\n');
printf("Ошибка ввода!Попробуйте снова!\nВвод:");
}
if(t==1){
printf("Приближенное x=%.3f\nF(x)=%.3f\nКоличество делений n=%d \nТочное x=%.3f\nАбсолютная погрешность=%.3f\nОтносительная погрешность=%.3f%%\n", x, fm, n, x1, pog1, pog);
system("pause");
}
if(t==2){
printf("Корень не подсчитан!Программа закрывается!\n");
system("pause");
exit(0);
}
else{
printf("Неверный ввод!Программа закрывается!\n");
system("pause");
exit(0);
}
}
else{
printf("Приближенное x=%.3f\nF(x)=%.3f\nКоличество делений n=%d \nТочное x=%.3f\nАбсолютная погрешность=%.3f\nОтносительная погрешность=%.3f%%\n", x, fm, n, x1, pog1, pog);
system("pause");
}
initwindow(800, 600);
Axes();
Plot();
getch();
closegraph();
}
graphic.cpp - отображение графиков функций и процесс вычисления корня
float ScreenX(float x){
return(x-g)/(s-g)*getmaxx();
}
float ScreenY(float y){//перевод y в координаты экрана
float y_min, y_max;
y_min=-(600-Y0)/k;
y_max=Y0/k;
return getmaxy() - (y-y_min)/(y_max-y_min)*getmaxy();
}
void Point(float x, float y, int color){
float xe, ye;
xe=ScreenX(x);
ye=ScreenY(y);
if(xe>=0&&xe<800&&ye>=0&&ye<600)
putpixel(xe, ye, color);
}
void Plot(){
float x, h, x_min, x_max;
h=0.0001;//шаг
for(x=g;x<=s;x+=h)
switch(v)
{
case 1:
Point(x, F1(x), RED);
break;
case 2:
Point(x, F2(x), RED);
break;
case 3:
Point(x, F3(x), RED);
break;
}
}
void Axes()
{
setcolor(8);
line(400, 0, 400, 599);
line(0, 300, 799, 300);
}
Выводы по работе
Изучен теоретический материал для создания программы для решения уравнения методом половинного деления. Разработан алгоритм решения поставленной задачи, разработана и протестирована программа на языке Си, выявленные ошибки в ходе тестирования устранены, контрольное тестирование ошибок не показала. Изучен и применен теоретический материал для работы с графикой на языке Cи.
Список используемой литературы
1. MachineLearning.ru. http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B4%D0%B8%D1%85%D0%BE%D1%82%D0%BE%D0%BC%D0%B8%D0%B8. Интернет ресурс.
2. math.semestr.ru.
http://math.semestr.ru/optim/dichotomy.php. Интернет ресурс.
3. Мудров А.Е “Численные методы на языках Basic, Pascal, Fortrun”.
Размещено на Allbest.ru
...Подобные документы
Тестирование модуля отыскания корня уравнения методом половинного деления. Схема алгоритма тестирующей программы. Численное интегрирование по методу Симпсона с оценкой погрешности по правилу Рунге. Проверка условий сходимости методов с помощью MathCAD.
курсовая работа [1,1 M], добавлен 04.02.2011Решение нелинейного уравнения шаговым методом, методом половинного деления, методом Ньютона и простой итерации с помощью программы Mathcad. Разбиение промежутка на число n интервалов. Условия сходимости корня. Составление программы для решения на С++.
лабораторная работа [207,5 K], добавлен 10.05.2012Особенности точных и итерационных методов решения нелинейных уравнений. Последовательность процесса нахождения корня уравнения. Разработка программы для проверки решения нелинейных функций с помощью метода дихотомии (половинного деления) и метода хорд.
курсовая работа [539,2 K], добавлен 15.06.2013Разработка с использованием приложения Mathcad алгоритма и программы решения нелинейного уравнения методами касательных, половинного деления и хорд. Решение с помощью ее заданных нелинейных уравнений. Создание графической иллюстрации полученных решений.
курсовая работа [665,7 K], добавлен 22.08.2013Разработка программного обеспечения для решения нелинейного уравнения методом деления отрезка пополам, методом деления Гаусса. Алгоритм определения и методика уточнения корней. Составление и тестирование программы, ее листинг и оценка эффективности.
контрольная работа [638,0 K], добавлен 16.12.2013Метод численного интегрирования. Использование метода половинного деления для решения нелинейного уравнения. Определение отрезка неопределенности для метода половинного деления. Получение формулы Симпсона. Уменьшение шага интегрирования и погрешности.
курсовая работа [3,0 M], добавлен 21.05.2013Создание параллельной программы на языке программирования высокого уровня С с расширением MPI и аналогичной программы на OpenMP для решения двумерного уравнения Пуассона итерационным методом Зейделя. Блок-схема алгоритма, анализ работы программы.
контрольная работа [62,9 K], добавлен 06.01.2013Разработка программы для нахождения корней нелинейных уравнений несколькими методами: методом хорд, касательных, половинного деления, итераций. Реализации программы с помощью системы программирования Delphi 7. Методика работы пользователя с программой.
курсовая работа [1,3 M], добавлен 11.02.2013Метод половинного деления как один из методов решения нелинейных уравнений, его основа на последовательном сужении интервала, содержащего единственный корень уравнения. Алгоритм решения задачи. Описание программы, структура входных и выходных данных.
лабораторная работа [454,1 K], добавлен 09.11.2012Описание методов дихотомии (половинного деления) и касательных. Их применение для решения нелинейных уравнений. Графическое отделение корней. Блок-схемы алгоритмов. Тексты (листинги) программ на языке Delphi. Тестовый пример решения задачи с помощью ЭВМ.
курсовая работа [944,6 K], добавлен 15.06.2013Математическое описание задачи решения обыкновенного дифференциального уравнения численным явным методом Рунге-Кутта, разработка схемы алгоритма и написание программы в среде программирования Microsoft Visual Studio 2010. Тестирование работы программы.
курсовая работа [1,1 M], добавлен 22.01.2014Решение трансцендентного уравнения методом Ньютона. Построение графика функции. Блок-схема алгоритма решения задачи и программа решения на языке Pascal. Вычисление значения интеграла методом трапеции, блок-схема алгоритма, погрешности вычисления.
задача [163,4 K], добавлен 16.12.2009Исследование систем методами случайного поиска. Изучение сущности метода половинного деления. Сравнительный анализ прямого перебора и половинного деления. Ручной счет. Шаги исследования. Описание окна работающей программы. Блок-схема и код программы.
курсовая работа [257,5 K], добавлен 06.05.2014Описание алгоритма создания программы для решения алгебраических или трансцендентных уравнений с помощью численного метода Бернулли. Нахождение значений корней алгебраического уравнения с заданными параметрами точности. Листинг программы на языке java.
контрольная работа [206,0 K], добавлен 19.06.2015Математическое описание, алгоритм и программа вычисления нелинейного уравнения методом дихотомии. Метод половинного деления. Метод поиска корней функции. Написание текста программы с комментариями. Проведение тестовых расчетов. Вывод ответа на экран.
курсовая работа [67,2 K], добавлен 15.02.2016Описание математической модели. Обоснование метода реализации. Вид алгоритма и программы. Руководство системного программиста, оператора. Комбинирование метод хорд и касательных. Интерпретация и анализ результатов. Листинг программы, контрольный пример.
курсовая работа [3,3 M], добавлен 12.01.2014Разработка программы на языке С++ для решения дифференциального уравнения Лапласа в прямоугольной области методом сеток. Численное решение задачи Дирихле для уравнения Лапласа, построение сетки и итерационного процесса. Листинг и результат программы.
курсовая работа [307,5 K], добавлен 30.04.2012Создание и реализация алгоритма решения транспортной задачи методом наименьших стоимостей. Схема алгоритма основной программы. Основные шаги алгоритма решения транспортной задачи. Инструкция по эксплуатации программы и обзор результатов ее выполнения.
курсовая работа [2,0 M], добавлен 12.02.2013Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.
курсовая работа [435,8 K], добавлен 15.06.2013Решение биквадратного уравнения методом введения новой переменной. Создание программы с понятным интерфейсом. Математические и алгоритмические основы решения задачи. Алгебраическое уравнение четвертой степени. Программная реализация решения задачи.
курсовая работа [412,5 K], добавлен 02.02.2010