Контрольная работа по "Математике"
Контрольная работа, 01 Декабря 2013, автор: пользователь скрыл имя
Описание работы
На практике часто встречаются задачи связанные с решением уравнения вида f(х)=0.Точное решение не всегда возможно найти, поэтому разработаны численные методы: метод дихотомии, Ньютона и др. При этом решаются две задачи:
1. Вычисление корней с заданной заранее точностью.
2. Отыскание областей, где имеется один корень.
Содержание работы
1. Введение…………………………………………………….……………3
2. Постановка задачи……………………………………………………...4
3. Методы решения..…………………………………………………….…6
4. Листинги программ…………………………………………………….11
5. Результаты………………………………………………………………19
Файлы: 1 файл
practic.doc
— 154.00 Кб (Скачать файл)МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН
УНИВЕРСИТЕТ МЕЖДУНАРОДНОГО БИЗНЕСА
Кафедра Информационные системы
ОТЧЁТ
По вычислительной практике
«Элементы численного анализа»
Выполнил:
ст. гр. ВТиПО-225
Степанов В.А.
Проверила:
Доц. каф. ИС
Молдагулова А.Н.
Алматы 2008
СОДЕРЖАНИЕ
- Введение…………………………………………………….…
…………3 - Постановка задачи……………………………………………………...4
- Методы решения..…………………………………………………….
…6 - Листинги программ…………………………………………………….
11 - Результаты……………………………………………………
…………19
ВВЕДЕНИЕ
На практике часто встречаются задачи связанные с решением уравнения вида f(х)=0.Точное решение не всегда возможно найти, поэтому разработаны численные методы: метод дихотомии, Ньютона и др. При этом решаются две задачи:
- Вычисление корней с заданной заранее точностью.
- Отыскание областей, где имеется один корень.
В научно-технической практике часто требуется найти значение определённого интеграла. Применяются методы: трапеций и Симпсона.
С помощью численных методов: метод Гаусса, возможно решение сложных систем уравнений.
Данная работа основана на конкретном применении шести методов: дихотомии, хорд, Ньютона, метода трапеций, Симпсона, Гаусса.
Целью данной вычислительной практики является освоение вышеперечисленных методов, создание программ для их реализации.
ПОСТАНОВКА ЗАДАЧИ
- Решение алгебраических уравнений методом Ньютона. Решить уравнение . Очередное приближение корня находится по формуле:
- Метод дихотомии. Решить уравнение методом деления отрезка пополам. На каждой итерации отрезок [a,b] делится пополам и выбирается та из половин, на концах которой функция имеет значения разных знаков.
- Метод хорд. Найти решения уравнения на заданном отрезке методом хорд, в котором очередное приближение находится по формуле: .
- Вычисление определенного интеграла методом трапеций. Вычислить определенный интеграл методом трапеций: , где n – количество отрезков разбиения; y0,y1,….,yn – значения подынтегральной функции на концах отрезков.
- Метод Симпсона. Вычисление определенного интеграла методом трапеций. Вычислить определенный интеграл методом Симпсона: , где 2n – количество отрезков разбиения; y0,y1,…,y2n – значения подынтегральной функции на концах отрезков.
- Решение систем линейных уравнений методом Гаусса. Решить следующую систему линейных уравнений методом Гаусса:
2x1+0.3x2+0.5x3=4.1;
0.1x1+3x2+0.4x3=7.3;
0.1x1+0.1x2+4.8x3=14.7.
МЕТОДЫ РЕШЕНИЯ
1. Метод Ньютона
Отличие этого итерационного метода от метода хорд состоит в том, что вместо хорды на каждом шаге проводится касательная к кривой y = f(x) при x = хi и ищется точка пересечения касательной с осью абсцисс (Рисунок 4). При этом не обязательно задавать отрезок [а, b], содержащий корень уравнения (1), достаточно найти лишь некоторое начальное приближение корня x = х0.
Применяя метод Ньютона, следует руководствоваться следующим правилом: в качестве исходной точки х0 выбирается тот конец интервала [а, b], которому отвечает ордината того же знака, что и знак f'' (х).
Рисунок 4.
Уравнение касательной, проведенной к кривой y = f(x) через точку В0 с координатами х0 и f(х0), имеет вид:
Отсюда найдем следующее приближение корня х1 как абсциссу точки пересечения касательной с осью Ох (y = 0):
Аналогично могут быть найдены и следующие приближения как точки пресечения с осью абсцисс касательных, проведенных в точках В1, В2 и так далее. Формула для i +1 приближения имеет вид:
Для окончания итерационного процесса может быть использовано или условие | f(xi)| < e , или условие близости 2х последовательных приближений | xi - xi - 1 | < e .
Итерационный процесс сходится если
f(х0) * f'' (х0) > 0.
- Метод дихотомии (деления пополам)
Метод дихотомии несколько схож с методом двоичного поиска, однако отличается от него критерием отбрасывания концов.
Пускай задана функция .
Разобьём мысленно заданный отрезок пополам и возьмём две симметричные относительно центра точки и так, что:
,
где — некоторое число в интервале
Отбросим тот из концов изначального интервала, к которому ближе оказалась одна из двух вновь поставленных точек с максимальным значением (напомним, мы ищем минимум), то есть:
- Если , то берётся отрезок , а отрезок отбрасывается.
- Иначе берётся зеркальный относительно середины отрезок , а отбрасывается .
Процедура повторяется пока не будет достигнута заданная точность, к примеру, пока длина отрезка не достигнет удвоенного значения заданной погрешности.
- Метод хорд
Точный корень уравнения находится на отрезке . Производная на этом промежутке непрерывна и сохраняет постоянный знак. Приближенный корень , при котором , можно найти используя метод хорд. Для этого нужно взять
начальное приближение
корня
и применить к нему итерационную формулу
,
, если
,
, если
Погрешность вычислений:
,
,
- Метод трапеций
Если функцию на каждом из частичных отрезков аппроксимировать прямой, проходящей через конечные значения, то получим метод трапеций.
Площадь трапеции
на каждом отрезке:
Погрешность аппроксимации на каждом
отрезке:
, где
Полная формула трапеций в случае деления
всего промежутка интегрирования на отрезки
одинаковой длины h:
, где
Погрешность формулы трапеций:
, где
- Метод Симпсона
Использовать
три точки отрезка
.
Если разбить интервал интегрирования на 2N равных частей, то имеем
, где .
6. Метод Гаусса
- На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна. А именно, среди элементов первого столбца матрицы выбирают ненулевой, перемещают его на крайнее верхнее положение перестановкой строк и вычитают получавшуюся после перестановки первую строку из остальных строк, домножив её на величину, равную отношению первого элемента каждой из этих строк к первому элементу первой строки, обнуляя тем самым столбец под ним. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.
- На втором этапе осуществляется так называемый обратный ход, суть которого заключается в том, чтобы выразить все получившиеся базисные переменные через небазисные и построить фундаментальную систему решений либо, если все переменные являются базисными, то выразить в численном виде единственное решение системы линейных уравнений. Эта процедура начинается с последнего уравнения, из которого выражают соответствующую базисную переменную (а она там всего одна) и подставляют в предыдущие уравнения, и так далее, поднимаясь по «ступенькам» наверх. Каждой строчке соответствует ровно одна базисная переменная, поэтому на каждом шаге, кроме последнего (самого верхнего), ситуация в точности повторяет случай последней строки.
ЛИСТИНГИ ПРОГРАММ
1.
#include <math.h>
#include <iostream.h>
#include <conio.h>
double Func(double x) //Функция
{
return 2*sqrt((5*(pow(x+1,0.25))+4))-
}
double Fp(double x) //производная от Функции
{
return (5/4)*((pow(x+1,-0.75))/sqrt(
}
void main()
{
double a=-0.75,b=1,X=a;// интервал и X
double Xt,E=1E-4;//предыдущий X и E-точность вычислений
int count=0;// счетчик итераций
do
{
count++;
Xt=X;
X=-Func(X)/Fp(X)+X; // метод касательных
cout<<"["<<count<<"]="<<X<<
if(Func(X)*Func(a)>0)a=X;
else b=X;
}while(fabs(X-Xt)>=E);
cout<<"X="<<X;
getch();
}
2.
#include <math.h>
#include <iostream.h>
#include <conio.h>
double Func(double x) //Функция
{
return 2*sqrt((5*(pow(x+1,0.25))+4))-
}
void main()
{
double a=-.75,b=1,X=a;// интервал и X
double Xt,E=1E-4;//предыдущий X и E-точность вычислений
int count=0;// счетчик итераций
do
{
count++;
Xt=X;
X=(b+a)/2; // деление пополам
cout<<"["<<count<<"]="<<X<<
if(Func(X)*Func(a)>0)a=X;
else b=X;
}while(fabs(X-Xt)>=E);
cout<<"X="<<X;
getch();
}
3.
#include <math.h>
#include <iostream.h>
#include <conio.h>
double Func(double x) //Функция
{
return 2*sqrt((5*(pow(x+1,0.25))+4))-
}
void main()
{
double a=-.75,b=1,X=a;// интервал и X
double Xt,E=1E-4;//предыдущий X и E-точность вычислений
int count=0;// счетчик итераций
do
{
count++;
Xt=X;
X=-((b-a)/(Func(b)-Func(a)))*
cout<<"["<<count<<"]="<<X<<
if(Func(X)*Func(a)>0)a=X;
else b=X;
}while(fabs(X-Xt)>=E);
cout<<"X="<<X;
getch();
}
4.
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
int b=1,a=0;
float s=0;
int n;
cout<<"Programma integrirovania metodom trapecii:\n"<<"Vvedite chislo otrezkov razbienia\n";
cin>>n;
float h=(b-a)/n;
float x;
x=a;
int i;
for (i=1; i<=n-1; i++)
{
x=x+h;
s=s+(cos(x)/(1+cos(x)));
}
s=s+0.25+(cos(1)/2*(cos(1)+1))
cout<<"rezultat:\n"<<s;
getch();
}
5.
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
int b=1,a=0;
float sm=0,s1=0,s2=0;
int n;
cout<<"Programma integrirovania metodom trapecii:\n"<<"Vvedite chislo otrezkov razbienia\n";
cin>>n;
float n2=n/2-1;
float h=(b-a)/n;
float x;
x=a;
int i;
for (i=1; i<=n2; i++)
{
x=x+h;
s1=s1+(cos(x)/(1+cos(x)));
x=x-h;
s2=s2+(cos(x)/(1+cos(x)));
}
sm=4*cos(x+h)/(cos(x+h)+1)+4*
sm=sm/3;
sm=sm*h;
cout<<"rezultat"<<endl<<sm;
getch();
}
6.
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 50
void glavelem( int k, double mas[] [N + 1], int n, int otv[] );
int main( void )
{
double mas[N] [N + 1];
double x[N]; //Корни системы
int otv[N]; //Отвечает за порядок корней
int i, j, k, n;
//Ввод данных
clrscr();
do
{
printf( "Vvedite chislo uravneni sistemi: " );
scanf( "%d", & n );
if ( N < n )
printf( "Slishkom bolshoe chislo uravneni\n" );
}
while ( N < n );
printf( "vvedite sistemu\n" );
for ( i = 0; i < n; i++ )
for ( j = 0; j < n + 1; j++ )
scanf( "%lf", & mas[i] [j] );