Линейные, ветвящиеся и циклические алгоритмы
Автор: Nargo_79 • Май 19, 2023 • Лабораторная работа • 1,868 Слов (8 Страниц) • 182 Просмотры
ОТЧЕТ
по лабораторной работе №1
Тема: «Линейные, ветвящиеся и циклические алгоритмы»
Лабораторная работа № 1
Тема: «Линейные, ветвящиеся и циклические алгоритмы»
Цель работы: Развивать навыки асимптотического анализа алгоритмов, сортировки при решении задач, использования алгоритмов поиска и выбора наиболее удобного пути путем их анализа.
Практическая часть
Вариант 13
Задание 1.
Вычислите данный интеграл методом Симпсона. Указаны количество интервальных делений N и количество попыток M.
№ | 𝒇(𝒙) | [𝒂,𝒃] | 𝑵 | 𝑴 |
13. | (𝑥2+𝑥+1)/√𝑥3+5 | [0;2] | 20 | 150 |
[pic 1]
[pic 2]
[pic 3]
[pic 4]
[pic 5]
[pic 6]
[pic 7]
[pic 8]
[pic 9]
[pic 10]
[pic 11]
[pic 12]
[pic 13]
[pic 14]
[pic 15]
[pic 16]
[pic 17]
[pic 18]
[pic 19]
[pic 20]
[pic 21]
[pic 22]
[pic 23]
[pic 24]
[pic 25]
[pic 26]
- Метод Симпсона
Code:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
float f(float x) { return (x*x+x+1)/sqrt(pow(x,3)+5);}
int i, m; float n, a, b, h, s;
int main(int argc, char *argv[])
{ cout<<endl<<" f(x) = (x^2+x+1)/(x^3+5)"<<endl;
cout<<endl<<" Integralni hisoblashning Simpson usuli"<<endl;
cout<<endl<<" a = "; cin>>a;
cout<<endl<<" b = "; cin>>b; cout<<endl<<" n = "; cin>>n;
h=(b-a)/n; cout<<endl<<" h = "<<h<<endl;
cout<<endl<<" m = ";
cin>>m;
for (i=1; i<=m; i++) {
s+= f(a+(2*i-2)*h) + 4*f(a+(2*i-1)*h) + f(a+2*i*h) ;
}
s=s*h/3;
cout<<endl<<" Integral = "<<s<<endl<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Результат:
[pic 27]
[pic 28]
- Метод Монте-Карло
Code:
#pragma hdrstop
#include <math.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#pragma argsused
double func(double x, int n)
{
return (x*x+x+1)/sqrt(pow(x,3)+5);
}
int main(int argc, char* argv[])
{
int a,b,n,d,i, st;
double c;
printf("st: ");
scanf("%d",&st);
printf("\na: ");
scanf("%d",&a);
printf("\nb: ");
scanf("%d",&b);
printf("\nn: ");
scanf("%d",&n);
if (func(a,st)>=func(b,st))
c=func(a,st);
else
c=func(b,st);
double *x=new double[n];
double *y=new double[n];
srand(time(NULL));
d=int(c);
int count=0;
for (i=0; i<n; i++)
{
x[i]=a+rand()%(b-a);
y[i]=rand()%d;
if (y[i]<func(x[i],st))
count++;
}
double integral=count*(b-a)*c/n;
printf("\nIntegral=%f", integral);
getch();
return 0;
}
Результат:
[pic 29]
[pic 30]
Задание 2.
Итерационные методы решения алгебраических и трансцендентных уравнений деления интервала на две равные части.
- Определите графическим и аналитическим методами решения уравнений расположенные в интервал [a; б].
- После определения интервалов, в которых находятся решения уравнений, приближенно рассчитать решения с точностью E=0,001 путем деления интервала на две равные части. Создав алгоритм, написать программный код на языке программирования и получить результат.
- Найдите приближенные решения алгебраических и трансцендентных уравнений. Создав алгоритм, написать программный код на языке программирования и получить результат.
[pic 31]
[pic 32]
[pic 33]
[pic 34]
[pic 35]
[pic 36]
[pic 37]
[pic 38]
и [pic 39][pic 40]
[pic 41][pic 42]
[pic 43][pic 44]
[pic 45]
[pic 46]
и [pic 47][pic 48]
[pic 49]
[pic 50]
[pic 51]
...