Решение прикладных задач численными методами

Кафедра №83

	информатики и вычислительной математики

	Дисциплина: «ИНФОРМАТИКА»

















	КУРСОВАЯ РАБОТА



Тема: «Решение прикладных задач численными методами»





























Москва 2009 г.


ЦЕЛЬ РАБОТЫ:



Получение практических навыков по применению численных методов при решении прикладных задач на ЭВМ общего назначения, с использованием программ сложных циклических алгоритмов, включая редактирование программ в ЭВМ, отладку программ, выполнение расчетов на периферийные устройства.



Время: 12 часов.



МЕТОДИЧЕСКИЕ УКАЗАНИЯ



Работа состоит из 2-х частей.

Цель первой части курсовой работы: получить практические навыки в использовании численных методов решения не линейных уравнений используемых в прикладных задачах.

Для выполнения 1 части работы необходимо:

Составить программу и рассчитать значения функции в левой части нелинейного уравнения для решения задачи отделения корней;

Составить логическую схему алгоритма, таблицу идентификаторов и  программу нахождения корня уравнения методом дихотомии и методом, указанным в таблице;

Ввести программу в компьютер, отладить, решить задачу с точностью ε=0,0001 и вывести результат;

Предусмотреть в программе вывод на экран дисплея процессора получения корня.

Задание на выполнение первой части курсовой работы:


Вариант №21.



Уравнение: 0,25x3+x-1,2502=0:



Отрезок, содержащий корень: [0;2].



Математическое описание численных методов решения

 

Метод деления отрезка пополам (метод дихотомии).



Этот метод позволяет отыскать корень уравнения с любой наперёд заданной точностью εε . искомый корень 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ε. В этом случае принимаем за приближенное значение корня середину оставленного отрезка и требуемая точность будет достигнута.  



График функции.


Для выделения корней рассчитаем значения функции на заданном отрезке [0,2] с шагом 0,0001 и по полученным данным построим график функции.







Как видно из рисунка график пересекает ось Х один раз, следовательно, на данном отрезке [ 0, 2] наше уравнение имеет один корень.




Алгоритмы нахождения корней уравнения



I.	Cтруктурная схема алгоритма:  Метод дихотомии



начало







a0, b0 , ε











f(a0), f(b0)







n=0









C=an+bn

   2









нет

да



f(c)=0







нет

f(an)* f (c)<0



                                                                             да



x=c









an+1=an ;  bn+1=c



an+1= c ;  bn+1= bn











n=n+1







(b-a)>2ε

да



нет







X=an+bn

   2











X













конец





Листинг программы имеет вид



#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. Схема алгоритма:



НАЧАЛО





1



f(x)= 0,25x3+x-1,2502=0





              a=0

2





3



              b=2





               n=0

4





        eps=0.0001

5





6



              xn=a







   |xn-x|>eps



7



нет

да





             КОНЕЦ         

Вывод: n,xn,f(xn)

                 x=xn

                n=n+1

 xn=x-f(x)·(b-a)/(f(b)-f(x))

    Вывод: n,xn



8







9







10







12

11









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.



Метод Эйлера-Коши

Метод Эйлера-Коши (или усовершенствованный метод Эйлера) является методом второго порядка и заключается в следующем. Интегральная кривая на каждом шаге интегрирования заменяется прямой с тангенсом угла наклона, равным среднему арифметическому тангенсов углов наклона касательных к искомой функции в начале и в конце шага. Вычисления проводятся в следующем порядке:

		Выбираем шаг интегрирования .

		Полагаем номер шага .

		Вычисляем , находим оценку для приращения функции на этом шаге методом Эйлера , , вычисляем среднее арифметическое тангенсов углов наклона  и окончательно получаем:

.

		Если , то увеличиваем номер шага  на единицу и повторяем п.3. В противном случае переходим к выполнению п.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




Схема алгоритма:





i=0; i≤2; i=i++

S=0

y=0

x=0;x≤xmax;h[i]

s=s+1

h[3]={0.01,0.005,0.001



x1=x+h[i]

k=x/(4+x4)

y=y+k∙h[i]

yt=(1/8)*arctg(x2/2)

                 d = y-yT



Вывод s,x1,y,yt,d.

конец

НАЧАЛО




















































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 С позволяет обрабатывать программы, записанные на языке  С++ . Для программирования циклических алгоритмов были использованы операторы организации циклов с параметрами, решение использует форматируемый вывод и оператор присваивания, а также использовались операторы вызова функций. Чем больше шаг, тем точнее вычисления.