Решение прикладных задач численными методами
Кафедра №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);
}
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
|
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;
}
Вывод: