К. Э. Циолковского Кафедра «Высшей математики» Курсовая

Вид материалаКурсовая
Подобный материал:

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО НАУКЕ И ОБРАЗОВАНИЮ РФ

«МАТИ» - Российский государственный технологический университет

им. К.Э. Циолковского


Кафедра «Высшей математики»


Курсовая работа

по дисциплине «Вычислительная математика»

Вариант №12


Выполнил

студент группы: .

2АСУ-2ДБ-074


Проверил

Старший преподаватель: Душкин Ю.И.


Москва 2006

СОДЕРЖАНИЕ


1. Задание I: Метод дихотомии 3

1.1. Постановка задачи 3

1.2. Разработка алгоритма 3

1.3. Структурограмма 4

1.4. Программа решения задания 5

1.5. Результат счета 6

2. Задание II: Метод простой итерации 8

2.1. Постановка задачи 8

2.2. Разработка алгоритма 8

2.3. Структурограмма 9

2.4. Программа решения задания 10

2.5. Результат счета 11

3. Задание III: Метод Ньютона 12

3.1. Постановка задачи 12

3.2. Разработка алгоритма 12

3.3. Структурограмма 13

3.4. Программа решения задания 14

3.5. Результат счета 14

4. Задание IV: Метод секущих 15

4.1. Постановка задачи 15

4.2. Разработка алгоритма 15

4.3. Структурограмма 16

4.4. Программа решения задания 17

4.5. Результат счета 17

5. Задание V: Гибридный метод 18

5.1. Постановка задачи 18

5.2. Разработка алгоритма 18

5.3. Структурограмма 19

5.4. Программа решения задания 20

5.5. Результат счета 20

6. Задание VI: Решение системы линейных алгебраических уравнений 21

6.1. Постановка задачи 21

6.2. Разработка алгоритма 21

6.3. Структурограмма 22

6.4. Программа решения задания 23

6.5. Результат счета 25

7. Задание VII: Решение системы нелинейных уравнений 26

7.1. Постановка задачи 26

7.2. Разработка алгоритма 26

7.3. Структурограмма 27

7.4. Программа решения задания 28

7.5. Результат счета 29

Список литературы 30

Задание I: Метод дихотомии


1.1. Постановка задачи

Задано нелинейное уравнение



Требуется найти корни этого уравнения, т.е. те значения , при подстановке которых уравнение обращается в тождество методом дихотомии с точностью , , .

1.2. Разработка алгоритма

За основу метода берется теорема Больцмана-Коши:

Если функция f(x) на концах принимает значения разных знаков: f(a)*f(b)<0, то тогда всегда существует такое значение x=c, что f(c)=0; cÎ[a,b], причем корень будет единственен, если производная на рассматриваемом интервале не меняет знака.

Таким образом, при решении нелинейных уравнений метом дихотомии, начальный отрезок разбивается на два равных отрезка, и проверятся теорема Больцмана-Коши (Лапчик М.П. «Численные методы»). Корень лежит либо на одном из отрезков либо в середине, потом еще раз делится на два отрезка отрезок, на котором находится корень, и т.д.

1.3. Структурограмма





Ввод


Вычисление


If

ДА НЕТ


Вывод: интервал не содержит

корней или четное количество

корней


If

ДА НЕТ





If

ДА НЕТ


Вывод Возврат к *


1.4. Программа решения задания

Тело функции будет храниться в заголовочном файле func.h. Тело функции реализовано на языке программирования высокого уровня C++

#include

#include

float func (float x)

{

return 10*powf(x,3)+20*pow(x,2)-0.1*x-0.2;

}

float dfunc (float x)

{

return 30*powf(x,2)-40*x-0.1;

}

Программа обращается к заголовочному файлу func.h посредством директивы #include “func.h”

Текст программы

#include

#include

#include "func.h"


void main()

{

int i=0;

float a,b,x,fx,fa,fb,eps=0.000001;

m1:

printf("Vvedite granicy otrezka");

scanf("%f%f",&a,&b);

fb=func(b);

if(fa*fb>0)

{

printf("Na otrezke kornei net\n");

goto m1;

}

do

{

x=(b-a)/2+a;

fx=func(x);

if(fa*fx<0)

b=x;

else

{

if(fa*fx==0)

{

a=x;

b=x;

}

else

a=x;

}

i++;

}

while(fabs(b-a)>eps);

x=a+(b-a)/2;

printf("x= %f\nKol-vo iteraciy=%d\n",x,i);

}


1.5. Результат счета


x=-2.000000 на отрезке [-2.1;-1.9]

x=-0.100000 на отрезке [-0.2;0]

x=0.100000 на отрезке [0;0.2]

Проверка в MathCAD:







Задание II: Метод простой итерации


2.1. Постановка задачи

Задано нелинейное уравнение



Требуется найти корни этого уравнения, т.е. те значения , при подстановке которых уравнение обращается в тождество методом простой с точностью , , .

2.2. Разработка алгоритма

Использование метода простой итерации для решения уравнения связано с преобразованием его к равносильному уравнению вида: .

Такое преобразование называется приведением уравнения к виду, удобному для итерации, и может быть выполнено различными способами. Функция называется итерационной функцией.

Выберем начальное приближение к корню и подставим его в правую часть . Получим . Подставив в правую часть , получим . Продолжая неограниченно этот процесс, получим последовательность приближений к корню, вычисляемую по формуле:

.

Метод простой итерации является одношаговым. Если существует предел этой последовательности и, полагая функцию непрерывной, получим равенство

,

которое означает, что - корень уравнения.

2.3. Структурограмма




Ввод


*


If

ДА НЕТ


Вывод Возврат к пункту *


2.4. Программа решения задания


#include

#include

#include "func.h"


void main()

{

int i=0,j=0,k=0;

float a=-1,b=0,x=0.,c,eps=0.000001,e1,e2,e,h,t,q,alpha,ymax=-1000,ymin=1000,xmax,xmin;

float q1[100];

puts("Vvedite ogranichenia na otrezok a,b i nachalnoe priblizhenie x0");

scanf("%f\t%f\n%f",&a,&b,&x);

e1=-2/dfunc(a);

e2=-2/dfunc(b);


h=(b-a)/100;

xmin=a;

xmax=b;

t=a;

for(i=0; i<100; i++)

{

q1[i]=dfunc(t);

t=t+h;

if(q1[i]
{

ymin=q1[i];

xmin=t-h;

}

if(q1[i]>ymax)

{

ymax=q1[i];

xmax=t-h;

}

}

q=fabs((ymax-ymin)/(ymax+ymin));

printf("\nq=%f",q);

if(fabs(e1)<=fabs(e2))

e=fabs(e1);

else

e=fabs(e2);

alpha=-2/(ymin+ymax);

printf("\nalpha=%f\n",alpha);

do

{

c=x;

x=x+alpha*func(c);

k++;

}

while((q/(1-q))*fabs(x-c)>eps);

printf("Koren uravnenia x=%f\n",x);

printf("Kol-vo iteraciy=%d\n",k);

}


2.5. Результат счета


x=-2.000000 на отрезке [-2.1;-1.9]

x=-0.100000 на отрезке [-0.2;0]

x=0.100000 на отрезке [0;0.2]

Задание III: Метод Ньютона


3.1. Постановка задачи

Задано нелинейное уравнение



Требуется найти корни этого уравнения, т.е. те значения , при подстановке которых уравнение обращается в тождество методом Ньютона с точностью , , .

3.2. Разработка алгоритма

Метод Ньютона можно рассматривать как один из вариантов метода простой итерации, который связан со специальным преобразованием уравнения f(x)=0 к виду х=φ(x), где φN(x)=х-(f(x)/f’(x)). Действительно, итерационная формула метода простой итерации x(n+1)= φ(x(n))= x(n)-(f(x(n))/f’(x(n))) совпадает с формулой метода касательных.

3.3. Структурограмма




Ввод


*


If

ДА НЕТ


Вывод Возврат к пункту *


3.4. Программа решения задания


#include

#include

#include "func.h"


void main()

{

int i=0;

float a,b,x,eps=0.000001,c;

puts("Vvedite granici otrezka a i b");

scanf("%f\n%f",&a,&b);

if(func(a)*d2func(a)>0)

x=a;

else

x=b;

do

{

c=x;

x=c-func(c)/dfunc(c);

i++;

}

while(fabs(x-c)>eps);

printf("x=%f\nkol-vo iteraciy=%d\n",x,i);

}


3.5. Результат счета


x=-2.000000 на отрезке [-2.1;-1.9]

x=-0.100000 на отрезке [-0.2;0]

x=0.100000 на отрезке [0;0.2]


Задание IV: Метод секущих


4.1. Постановка задачи

Задано нелинейное уравнение



Требуется найти корни этого уравнения, т.е. те значения , при подстановке которых уравнение обращается в тождество методом секущих с точностью , , .

4.2. Разработка алгоритма

Заменим производную в формуле метода Ньютона приближением и получим расчетную формулу метода секущих:



4.3. Структурограмма




Ввод


*


If

ДА НЕТ


Вывод Возврат к пункту *


4.4. Программа решения задания


#include

#include

#include "func.h"


void main()

{

int i=0;

float a,b,xp,xc,x,eps=0.000001;

puts("Vvedite granici otrezka a i b");

scanf("%f%f",&a,&b);

x=(a+b)/2;

if(dfunc(x)*d2func(x)>0)

{

xc=a;

xp=xc+(b-a)/100;

}

else

{

xc=b;

xp=xc+(a-b)/100;

}

{


}

do

{

xc=xp;

xp=x;

x=xp-((xc-xp)*func(xp))/(func(xc)-func(xp));

i++;

}

while(fabs(x-xp)>eps);

printf("x=%f\nkol-vo iteraciy=%d\n",x,i);

}


4.5. Результат счета


x=-2.000000 на отрезке [-2.1;-1.9]

x=-0.100000 на отрезке [-0.2;0]

x=0.100000 на отрезке [0;0.2]


Задание V: Гибридный метод


5.1. Постановка задачи

Задано нелинейное уравнение



Требуется найти корни этого уравнения, т.е. те значения , при подстановке которых уравнение обращается в тождество гибридным методом с точностью , , .

5.2. Разработка алгоритма

Итерационная формула метода Стеффенсена записывается следующим образом:



Можно считать, что она получена в результате замены производной , входящей в расчетную формулу метода Ньютона, по формуле где

5.3. Структурограмма




Ввод


*


If

ДА НЕТ


Вывод Возврат к пункту *


5.4. Программа решения задания


#include

#include

#include "func.h"


void main()

{

int i=0;

float a,b,xp,x,eps=0.000001;

puts("Vvedite granici otrezka a i b");

scanf("%f%f",&a,&b);

x=(a+b)/2;

do

{

xp=x;

x=xp-func(xp)*func(xp)/(func(xp+func(xp))-func(xp));

i++;

}

while(fabs(x-xp)>eps);

printf("x=%f\nkol-vo iteraciy=%d\n",x,i);

}


5.5. Результат счета


x=-2.000000 на отрезке [-2.1;-1.9]

x=-0.100000 на отрезке [-0.2;0]

x=0.100000 на отрезке [0;0.2]

Задание VI: Решение системы линейных алгебраических уравнений (СЛАУ)


6.1. Постановка задачи

Задана система линейных уравнений



Требуется найти решение данной системы.


6.2. Разработка алгоритма




- квадратная матрица

Для решения системы линейных уравнений необходимо найти главный определитель матрицы.



Далее определяем вспомогательные определители:



В том случае, если определитель матрицы равен нулю, то система линейных уравнений не имеет решения. Если определитель не равен нулю, то система имеет следующее решение:



Если , то система линейных уравнений имеет бесконечно много решений.

6.3. Структурограмма





Ввод A,B


Вычисление определителя




ДА НЕТ


Вывод: решений нет




Вывод


6.4. Программа решения задания


#include

#include

#include

#define L 9

int i,j,n=3,k,w,q;

float a[4][5],b[4][5],x,z,det,detA;

void determinant(void)

{

if(q!=0)

{

for(i=1;i<=n;i++)

{

for(j=1; j<=n+1; j++)

{

b[i][j]=a[i][j];

if(j==q)

{

b[i][j]=a[i][n+1];

}}}}

else

{

for(i=1;i<=n;i++)

{

for(j=1; j<=n+1;j++)

{

b[i][j]=a[i][j];

}}}

det=1.0;

for(k=1;k<=n;k++)

{

z=fabs(b[k][k]);

i=k;

for(j=k+1;j<=n;j++)//???

{

if(fabs(b[j][k])>z)

{

z=fabs(b[j][k]);

i=j;

}}

if(i>k)

{

det=det*(-1);

for(j=k;j<=n;j++)//???

{

z=b[i][j];

b[i][j]=b[k][j];

b[k][j]=z;

}}

z=b[i][n+1];

b[i][n+1]=b[k][n+1];

b[k][n+1]=z;

det=det*b[k][k];

for(j=k+1;j<=n+1;j++)

{

b[k][j]=b[k][j]/b[k][k];

}

for(i=k+1;i<=n;i++)

{

for(j=k+1;j<=n+1;j++)

{

b[i][j]=b[i][j]-b[k][j]*b[i][k];

}}}

q=q+1;

}

void main()

{

q=0;

printf("vvedite elementi rasshirennuyu matricu");

for(i=1;i<=n;i++)

{

for(j=1;j<=n+1;j++)

{

printf("a[%d][%d]=",i,j);

scanf("%f",&a[i][j]);

}}

printf("rasshirennaya matrica\n");

for(i=1;i<=n;i++)

{

for(j=1;j<=n+1;j++)

printf("%1.6f\t",a[i][j]);

printf("\n");

}

determinant();

detA=det;

for(w=1;w<=n;w++)

{

determinant();

printf("x%d=%1.6f",w,det/detA);

printf("\n");

}

}


6.5. Результат счета


Расширенная матрица:





= 1.981984

=-2.039600

= -0.959834

Проверка в MathCAD:




Задание VII: Решение системы нелинейных уравнений


7.1. Постановка задачи


Задана система линейных уравнений





Требуется найти решение данной системы с точностью

7.2. Разработка алгоритма

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

Для метода простой итерации должны выполняться условия диагонального преобладания:

либо по строкам

либо по столбцам

7.3. Структурограмма




Ввод


Есть ли точка пересечения

ДА НЕТ


Уточнения точки пересе- Вывод: корней нет

чения методом простой

итерации


Вывод x


7.4. Программа решения задания


#include

#include

#include "func.h"


void main()

{

int i=0,j=0,k=0;

float a=-1,b=0,x=0.,c,eps=0.000001,e1,e2,e,h,t,q,alpha,ymax=-1000,ymin=1000,xmax,xmin;

float q1[100];

puts("Vvedite ogranichenia na otrezok a,b i nachalnoe priblizhenie x0");

scanf("%f\t%f\n%f",&a,&b,&x);

e1=-2/dfunc(a);

e2=-2/dfunc(b);


h=(b-a)/100;

xmin=a;

xmax=b;

t=a;

for(i=0; i<100; i++)

{

q1[i]=dfunc(t);

t=t+h;

if(q1[i]
{

ymin=q1[i];

xmin=t-h;

}

if(q1[i]>ymax)

{

ymax=q1[i];

xmax=t-h;

}

}

q=fabs((ymax-ymin)/(ymax+ymin));

printf("\nq=%f",q);

if(fabs(e1)<=fabs(e2))

e=fabs(e1);

else

e=fabs(e2);

alpha=-2/(ymin+ymax);

printf("\nalpha=%f\n",alpha);

do

{

c=x;

x=x+alpha*func(c);

k++;

}

while((q/(1-q))*fabs(x-c)>eps);

printf("Koren uravnenia x=%f\n",x);

printf("Kol-vo iteraciy=%d\n",k);

}


7.5.Результат счета


x=-0.589317


Проверка в MathCAD:










Список литературы

1. Демидович Б. П., Марон И. А., Шувалова Э. З. Численные методы анализа.- М.: Наука, 1967.-368 с.

2. Демидович Б.П., Марон И.А. Основы вычислительной математики.-М.:Наука, 1966.-664 с.

3. Лапчик М.П., Рагулина М.И., Хеннер Е.К. Численные методы.- М.: Академия, 2005.- 384 с.

4. Азаров А. И., Басик В. А., Мелешко И. Н. и др. Сборник задач по методам вычислений . М.: Наука, ФМ, 1994.

5. Амосов А.А., Дубинская Ю.А., Копченов Н.В. Вычислительные методы для инженеров. М.: Высшая школа, 1994.

6. Бахвалов Н.С., Жидков Н. П., Кобельков Г. М. Численные методы. М.: Лаборатория базовых знаний, 2000.

7. Волков Е. А. Численные методы. М.: Наука, ФМ, 1987.

8. Дьяконов В. П. MATHCAD 2000. Серия Учебный курс. СПб.: ПИТЕР, 2000.

9. Дьяконов В. П. MATHCAD 2001. Серия Учебный курс. СПб.: ПИТЕР, 2001.

10. Кирьянов Д. В. MATHCAD 12. Полное руководство. СПб.: БХВ - Петербург, 2005