Решение прикладных задач численными методами
И вычисляется значение функции в точке с, т. е. находится f©. Если f (c)=0, то мы точно нашли корень уравнения. Если же f©?0, то знак этой величины сравнивается со знаками функции y= f (x) в концах отрезка. Из двух отрезков, для дальнейшего рассмотрения оставляется тот, в концах которого функция имеет разные знаки. С оставленным отрезком поступаем аналогичным образом. расчет прекращается, когда… Читать ещё >
Решение прикладных задач численными методами (реферат, курсовая, диплом, контрольная)
Кафедра № 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.
#include.
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.8lfn», n, x, f (x));
if (f (x)==0).
{.
printf («Tothnii koreni x=%lfnkolithestvo iteratsii n=%in», x, n);
return 0;
}.
else if (f (a)*f (x)<0) b=x;
else a=x;
}.
printf («Reshenie x=%11.8lf pri Eps=%lfnkolithestvo iteratsii n=%in», 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.
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.8lfn», n, xn, f (xn));
fprintf (jad," step=%3i x=%11.8lf f (x)=%11.8lfn", n, xn, f (xn));
}.
printf («pribligennoe znathenie x=%lf pri Eps=%lfnkolithestvo iterasii n=%in», xn, eps, n);
fprintf (jad," pribligennoe znathenie x=%lf pri Eps=%lfnkolithestvo iterasii n=%in", xn, eps, n);
fclose (jad);
return 0;
}.
7. Листинг решения:.
Анализ результатов:.
метод дихотомии. | метод хорд. | ||
значение корня. | -0.28 766. | -0.287 700. | |
значение функции. | -0.45. | -0.2 140. | |
количество итераций. | |||
Вывод: Метод дихотомии прост в реализации, но обладает малой скоростью сходимости по сравнению с методом хорд, что выражается в количестве шагов. Метод хорд к тому же обладает большей точностью.
Часть 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;
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)=%lfn", 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);// ypribl. f (x) — tochnoe.
printf («step =%4.i x=%6.4lf ty=%6.4lf yt=%6.4lf d=%10.8fn», s, x1, y, e (x1), d);
fprintf (sev," t step =t%4.it x=t%10.5lft y=t%10.5lft yt=t%10.5lft d=t%10.5fn", s, x1, y, e (x1), d);
}.
}.
fclose (sev);
return 0;
}.
Вывод:
Интегрированная среда Visual С позволяет обрабатывать программы, записанные на языке С++. Для программирования циклических алгоритмов были использованы операторы организации циклов с параметрами, решение использует форматируемый вывод и оператор присваивания, а также использовались операторы вызова функций. Чем больше шаг, тем точнее вычисления.