Отчет5 Чирухин 9-3

advertisement
Санкт-Петербургский
Государственный электротехнический университет
Кафедра МОЭВМ
Отчет
по Лабораторной работе №5
«Использование итерации в некоторых
численных методах. Процедурный
(функциональный) тип параметров»
Выполнил: Чирухин А.А.
Группа: 3304
Факультет: КТИ
Санкт-Петербург
2013г.
Цель работы:
Изучение и практическое использование численных методов, реализация
передачи имен процедуры или функции с помощью параметра
процедурного типа.
Постановка задачи:
Требуется найти приближенное значение корня уравнения F(x) = 0
методом хорд. Где F(x) = d*ln(x) – 1/x.
Формальная постановка задачи (математическое содержание):
Метод хорд:
Вычисляется последовательность значений границ интервалов a1, b1, a2, b2…,
an, bn… На (n+1) шаге рассматривается интервал [an, bn], такой, что F(an) и
F(bn) разного знака. Вычисляется положение точки пересечения хорды,
соединяющей точки (an, F(an)) и (bn, F(bn)), с осью абсцисс, т.е.
cn = an – un*(bn – an)/(Un – un),
где un = F(an), Un = F(bn). Затем формируется новый интервал[an+1, bn+1]: если
F(an) и F(сn) разного знака, то an+1 = an и bn+1 = cn, в противном случае an+1 = cn
и bn+1 = bn, здесь xn = cn-1.
Текст программы (lab5):
#include
#include
#include
#include
<iostream>
"stdio.h"
<math.h>
<iomanip>
using namespace std;
float getepsilon()
/*
*getepsilon()
*Проверяет p, введенное с клавиатуры,
на правильность (p - integer, p > 0);
считает значение епсилон (epsil)
*Возвращает epsil
*/
{
float epsil;
int p;
while (true)
{
cout << "Epsilon = 10^(-p); Enter p (0 < p < 46 ): ";
if (!scanf("%i", &p) || (p <= 0) || (p >= 46))
{
cout << "Incorrect p!" << endl;
fflush(stdin);
}
else
{
break;
}
}
epsil = exp(-p*log(10.0));
//Epsil = 10^(-p)
return epsil;
}
float function(float x, float d)
/*
*function()
*F(x) = d*ln(x) - x^2
*Возвращает значение функции F(x)
*/
{
float f;
f = d*log(x) - 1/x;
//F(x)
return f;
}
float searchx(float d,
/*
*searchx()
*Ищет корень уравнения
методом хорд
*Возвращает x
*/
{
float an = 1.1;
float bn = 1.7;
float cn = 1000;
float xn;
float z, j;
float delta;
float epsilon)
F(xn) = 0
//a0
//b0
//x
while (true)
{
j = cn;
cn = an - function(an, d)*((bn - an)/(function(bn, d) - function(an, d)));
if (((function(cn, d) > 0) && (function(an, d) < 0))
|| ((function(cn, d) < 0)&&(function(an, d) > 0)))
{
z = bn;
bn = cn;
delta = fabs((bn - z)/bn);
}
else
{
if (((function(cn, d) > 0) && (function(bn, d) < 0))
|| ((function(cn, d) < 0)&&(function(bn, d) > 0)))
{
z = an;
an = cn;
delta = fabs((an - z)/an);
}
}
xn = j;
//Условия завершения итерационного процесса
if (fabs(function(xn, d)) < epsilon)
{
break;
}
if (delta < epsilon)
{
break;
}
}
return xn;
}
void printx()
/*
*printx()
*Выводит значение x для каждого значения d
*/
{
float d = 1.5;
float epsilon = getepsilon();
cout << "Epsilon = " << epsilon << endl;
cout << scientific << setprecision(10) << endl;
// маниуляторы вывода
while (d <= 2.5)
{
cout << "d = " << d << " --- " << "x = " << searchx(d, epsilon) << endl;
d += 0.1;
}
}
int main ()
{
int k;
while (k != 0)
{
cout << "-----------------lab5-----------------" << endl;
printx();
// Подтверждение выхода из программы
while(true)
{
cout << "\nEnter 0 for exit or another integer for continue: ";
if (!scanf("%i", &k))
{
cout << "Incorrect integer!";
fflush(stdin);
}
else
{
break;
}
}
cout << endl;
}
cout << "-------------------" << endl;
cout << "Press Enter to exit";
cin.get();
cin.get();
}
Результаты решения задачи:
Программа выдает значение xn. Ошибки не обнаружены
Заключение:
При выполнении лабораторной работы были получены практические
навыки по изучению численных методов, реализации передачи имени
процедуры или функции на языке программирования «С++».
Download