Санкт-Петербургский Государственный электротехнический университет Кафедра МОЭВМ Отчет по Лабораторной работе №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. Ошибки не обнаружены Заключение: При выполнении лабораторной работы были получены практические навыки по изучению численных методов, реализации передачи имени процедуры или функции на языке программирования «С++».