Кафедра №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труктурная схема алгоритма: Методдихотомии/> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
f(a0), f(b0) /> /> /> /> /> /> />
да/> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
x=c /> /> /> /> /> />
an+1=an ; bn+1=c />
an+1= c ; bn+1= bn /> /> /> /> /> /> />
n=n+1 /> /> /> /> /> />
X=an+bn
2 /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
Листинг программы имеетвид
#include
#include
doublef(double x)
{
return0.25*(pow(x,3))+x-1.2502;
}
int main(void)
{
int n=0;
doublex,a=0.,b=2.,eps=0.0001;
while(fabs(a-b)>2*eps)
{
x=(a+b)/2,
n++;
printf(«step=%3ix=%11.8lf f(x)=%11.8lf\n»,n,x,f(x));
if (f(x)==0)
{
printf(«Tothniikoreni x=%lf\nkolithestvo iteratsii n=%i\n»,x,n);
return 0;
}
else if(f(a)*f(x)
else a=x;
}
printf(«Resheniex=%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
#include
doublef(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;
doublex,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(«pribligennoeznathenie x=%lf pri Eps=%lf\nkolithestvo iterasii n=%i\n»,xn,eps,n);
fprintf(jad,«pribligennoeznathenie 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
#include
int s,i;
double x, x1, x_max=2,y, d, q;
doubleh[3]={0.01,0.005,0.001};
doublek(double x,double y )
{
return((x)/(4+(pow(x,4))));
}
doublee(double x)
{
return0.25*atan(pow(x,2)/2);
}
doublef1=k(x,y);
doubleyw=y+f1*h[i];
doubler=x+h[i];
doublefl=k(r,yw);
int main(void)
{
FILE*sev;
sev=fopen(«E:result34.xls»,«w+»);
for(i=0;i
{
s=0; y=0;
fprintf(sev,«h(%i)=%lf\n»,i,h[i]);
for(x=0;x
{
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\td=\t%10.5f\n",s,x1,y,e(x1),d);
}
}
fclose(sev);
return 0;
}
/>
/>
/>
/>
/>
/>
/>
/>
/>
Вывод:
Интегрированная среда Visual С позволяет обрабатывать программы, записанныена языке С++. Для программирования циклических алгоритмов были использованыоператоры организации циклов с параметрами, решение использует форматируемыйвывод и оператор присваивания, а также использовались операторы вызова функций.Чем больше шаг, тем точнее вычисления.