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