Решение прикладных задач численными методами
Решение прикладных задач численными методами
Кафедра №83 информатики и вычислительной математики Дисциплина: «ИНФОРМАТИКА» КУРСОВАЯ РАБОТА Тема: «Решение прикладных задач численными методами» Москва 2009 г. ЦЕЛЬ РАБОТЫ: Получение практических навыков по применению численных методов при решении прикладных задач на ЭВМ общего назначения, с использованием программ сложных циклических алгоритмов, включая редактирование программ в ЭВМ, отладку программ, выполнение расчетов на периферийные устройства. Время: 12 часов. МЕТОДИЧЕСКИЕ УКАЗАНИЯ Работа состоит из 2-х частей. Цель первой части курсовой работы: получить практические навыки в использовании численных методов решения не линейных уравнений используемых в прикладных задачах. Для выполнения 1 части работы необходимо: · Составить программу и рассчитать значения функции в левой части нелинейного уравнения для решения задачи отделения корней; · Составить логическую схему алгоритма, таблицу идентификаторов и программу нахождения корня уравнения методом дихотомии и методом, указанным в таблице; · Ввести программу в компьютер, отладить, решить задачу с точностью е=0,0001 и вывести результат; · Предусмотреть в программе вывод на экран дисплея процессора получения корня. Задание на выполнение первой части курсовой работы: Вариант №21. Уравнение: 0,25x3+x-1,2502=0: Отрезок, содержащий корень: [0;2]. I. Математическое описание численных методов решения Метод деления отрезка пополам (метод дихотомии). Этот метод позволяет отыскать корень уравнения с любой наперёд заданной точностью ее . искомый корень x уравнения уже отделен, т.е.указан отрезок [а, в] непрерывности функции f(x) такой, что на концах этого отрезка функция f(x) принимает различные значения: f(a)*f(b)>0 В начале находится середина отрезка [ a, b ]: и вычисляется значение функции в точке с, т.е. находится f(c). Если f(c)=0, то мы точно нашли корень уравнения. Если же f(c)?0 ,то знак этой величины сравнивается со знаками функции y= f(x) в концах отрезка [ a, b ]. Из двух отрезков [ a, с], [ с, b ] для дальнейшего рассмотрения оставляется тот, в концах которого функция имеет разные знаки. С оставленным отрезком поступаем аналогичным образом. расчет прекращается, когда оставленный отрезок будет иметь длину меньше 2е. В этом случае принимаем за приближенное значение корня середину оставленного отрезка и требуемая точность будет достигнута. II. График функции. Для выделения корней рассчитаем значения функции на заданном отрезке [0,2] с шагом 0,0001 и по полученным данным построим график функции. Как видно из рисунка график пересекает ось Х один раз, следовательно, на данном отрезке [ 0, 2] наше уравнение имеет один корень. Алгоритмы нахождения корней уравнения I. Cтруктурная схема алгоритма: Метод дихотомии да Листинг программы имеет вид #include<stdio.h> #include<math.h> double f(double x) { return 0.25*(pow(x,3))+x-1.2502; } int main(void) { int n=0; double x,a=0.,b=2.,eps=0.0001; while (fabs(a-b)>2*eps) { x=(a+b)/2, n++; printf("step=%3i x=%11.8lf f(x)=%11.8lf\n",n,x,f(x)); if (f(x)==0) { printf("Tothnii koreni x=%lf\nkolithestvo iteratsii n=%i\n",x,n); return 0; } else if (f(a)*f(x)<0) b=x; else a=x; } printf("Reshenie x=%11.8lf pri Eps=%lf\nkolithestvo iteratsii n=%i\n",x,eps,n); return 0; }
Метод хорд: 1. Этот метод заключается в том, что к графику функции проводится хорда. Находим точку пересечения с осью OX и опускаем из этой точки прямую параллельную OY. Из точки пе-ресечения прямой и графика проводим хорду и операция повторяется до тех пор, пока точка пересечения хорды с осью OX не приблизиться к корню функции до заданной погрешности. Шаг первый: Нас интересует точка пересечения с осью ОХ. Сделаем допущение: х=x1 y=0 Введем обозначение x0 f()=f(x0) Подставим в уравнение Отсюда x1=x0- Шаг второй: x2=x1- Для n-го шага: xn=xn-1- Условием нахождения корня является: 2. Нелинейное уравнение и условие его решения: 0,25x3+x-1,2502=0: 3. График функции: 4. Схема алгоритма: 5. Таблица идетификаторов: |
Обозначение | Идентификатор | Тип | | n | n | int | | | a | double | | | b | double | | | eps | double | | x | x | double | | f(x) | f(x) | double | | |
6. Листинг программы: #include<stdio.h> #include<math.h> double f(double x) { return 0.25*(pow(x,3))+x-1.2502; } int main(void) { FILE*jad; jad=fopen("D:text.txt","w"); int n=0; double x,a=0,b=2.,eps=0.0001,xn; xn=a; while (fabs(xn-x)>eps) { x=xn; n++; xn=x-f(x)*(b-x)/(f(b)-f(x)); printf("step=%3i x=%11.8lf f(x)=%11.8lf\n",n,xn,f(xn)); fprintf(jad,"step=%3i x=%11.8lf f(x)=%11.8lf\n",n,xn,f(xn)); } printf("pribligennoe znathenie x=%lf pri Eps=%lf\nkolithestvo iterasii n=%i\n",xn,eps,n); fprintf(jad,"pribligennoe znathenie x=%lf pri Eps=%lf\nkolithestvo iterasii n=%i\n",xn,eps,n); fclose(jad); return 0; } 7. Листинг решения: Анализ результатов: |
| метод дихотомии | метод хорд | | значение корня | -0.28766 | -0.287700 | | значение функции | -0.000045 | -0.00002140 | | количество итераций | 13 | 6 | | |
Вывод: Метод дихотомии прост в реализации, но обладает малой скоростью сходимости по сравнению с методом хорд, что выражается в количестве шагов. Метод хорд к тому же обладает большей точностью. Часть 2 Использование численных методов решения дифференциальных уравнений для тактико-специальных задач Вариант №21. Задание на выполнения второй части курсовой работы: Дифференциальное уравнение:
Точное решение уравнения: Начальные условия: x0 = 0 , y0 =0, xmax=2. Метод решения: метод Эйлера-Коши, Дx = 0,01; 0,005; 0,001. Метод Эйлера-КошиМетод Эйлера-Коши (или усовершенствованный метод Эйлера) является методом второго порядка и заключается в следующем. Интегральная кривая на каждом шаге интегрирования заменяется прямой с тангенсом угла наклона, равным среднему арифметическому тангенсов углов наклона касательных к искомой функции в начале и в конце шага. Вычисления проводятся в следующем порядке:1. Выбираем шаг интегрирования .2. Полагаем номер шага .3. Вычисляем , находим оценку для приращения функции на этом шаге методом Эйлера , , вычисляем среднее арифметическое тангенсов углов наклона и окончательно получаем:. 4. Если , то увеличиваем номер шага на единицу и повторяем п.3. В противном случае переходим к выполнению п.5. 5. Оформляем полученный результат. Достоинство метода - более высокая точность вычисления по сравнению с методом Эйлера. Недостаток - больший объем вычислений правых частей. Таблица идентификаторов: |
Обозначение | Идентификатор | Тип | | s | s | int | | i | i | int | | x | x | float | | xmax | x_max | float | | x1 | x1 | float | | Дx | h[i] | float | | y | y | float | | d | d | float | | f(x) | f(x) | float | | k | k(x,y) | float | | K1 | f1 | float | | K2 | f2 | float | | K3 | f3 | float | | K4 | f4 | float | | |
Схема алгоритма: 6. Листинг программы: #include<stdio.h> #include<math.h> int s,i; double x, x1, x_max=2, y, d, q; double h[3]={0.01,0.005,0.001}; double k(double x,double y ) { return ((x)/(4+(pow(x,4)))); } double e(double x) { return 0.25*atan(pow(x,2)/2); } double f1=k(x,y); double yw=y+f1*h[i]; double r=x+h[i]; double fl=k(r,yw); int main(void) { FILE*sev; sev=fopen("E:result34.xls","w+"); for (i=0;i<=2;i++) { s=0; y=0; fprintf(sev,"h(%i)=%lf\n",i,h[i]); for(x=0;x<=x_max;x+=h[i]) { s++; x1=x+h[i]; y+=(f1+fl)*h[i]/2; d=y-e(x1);// y- pribl. f(x)- tochnoe printf(" step =%4.i x=%6.4lf \ty=%6.4lf yt=%6.4lf d=%10.8f\n",s,x1,y,e(x1),d); fprintf(sev," \t step =\t%4.i\t x=\t%10.5lf\t y=\t%10.5lf\t yt=\t%10.5lf\t d=\t%10.5f\n",s,x1,y,e(x1),d); } } fclose(sev); return 0; } Вывод: Интегрированная среда Visual С позволяет обрабатывать программы, записанные на языке С++ . Для программирования циклических алгоритмов были использованы операторы организации циклов с параметрами, решение использует форматируемый вывод и оператор присваивания, а также использовались операторы вызова функций. Чем больше шаг, тем точнее вычисления.
|