Метод Симпсона три восьмых
Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
float Y(double p);
int main()
{
setlocale(LC_CTYPE,"Russian");
double x, a, b, h, s,i;
int n;
cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
cin>>a;
cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
cin>>b;
cout<<"число разбиений --> (n) =\n";
cin>>n;
h = (b - a)/ (2*n);
cout<<"H="<<h;
s = 0; x = a + h;
while (x < b)
{
s = s + 2 * Y(x);
x = x + h;
s = s + 3 * Y(x);
x = x + h;
}
s = (3*h)/ 8 * ( s + Y(a) + Y(b));
cout<<"Интеграл = {0}"<<s;
}
float Y(double p)
{
return 1/(1+p*p);
}
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
float Y(double p);
int main()
{
setlocale(LC_CTYPE,"Russian");
double x, a, b, h, s,i;
int n;
cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
cin>>a;
cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
cin>>b;
cout<<"число разбиений --> (n) =\n";
cin>>n;
h = (b - a)/ (2*n);
cout<<"H="<<h;
s = 0; x = a + h;
while (x < b)
{
s = s + 2 * Y(x);
x = x + h;
s = s + 3 * Y(x);
x = x + h;
}
s = (3*h)/ 8 * ( s + Y(a) + Y(b));
cout<<"Интеграл = {0}"<<s;
}
float Y(double p)
{
return 1/(1+p*p);
}
Собственно вычислить надо интеграл по заданным в ручную границам
методом Симпсона Три восьмых
интеграл: 1/(1+p*p);
Прога дает не очень точный результат подскажите пути решения
желательно сразу наглядно чтоб меньше возникало вопросов)))
Спасибо
Попробуйте так:
Код:
h = (b - a)/ (3*n);
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)
{
x = a +h*i;
if (i%3 == 0)
s = s + 2*Y(x);
else
s = s + 3 * Y(x);
}
s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)
{
x = a +h*i;
if (i%3 == 0)
s = s + 2*Y(x);
else
s = s + 3 * Y(x);
}
s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;
Цитата: CorsaiR
По - моему у вас есть ошибки в реализации метода.
Попробуйте так:
Попробуйте так:
Код:
h = (b - a)/ (3*n);
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)
{
x = a +h*i;
if (i%3 == 0)
s = s + 2*Y(x);
else
s = s + 3 * Y(x);
}
s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)
{
x = a +h*i;
if (i%3 == 0)
s = s + 2*Y(x);
else
s = s + 3 * Y(x);
}
s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;
еще раз пробежался и понял косяк я да да
в строке ошибся Я поставив скобки
Код:
for (int i = 1; i<= 3* (n-1) ; i++)
Вот полный рабочий текст на новом примере результатом должно быть 8,75
Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
long double Y(double p);
int main()
{
setlocale(LC_CTYPE,"Russian");
long double x, a, b, h, s,i,n,m;
cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
cin>>a;
cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
cin>>b;
cout<<"число разбиений --> (n) =\n";
cin>>n;
h = ((b - a)/ (3*n)); cout<<"\nH="<<h;
s = Y(a)+Y(b);
m=3*n-1;
for (int i = 1; i<= m; i++)
{
x = a + h*i;
if (i%3 == 0)
s = s + 2 * Y(x);
else
s = s + 3 * Y(x);
}
s = s*3/8*h;
cout<<"\nИнтеграл = "<<s<<"\n";
}
long double Y(double p)
{
return ((p*p*p)+ (3*p*p)-2);
}
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
long double Y(double p);
int main()
{
setlocale(LC_CTYPE,"Russian");
long double x, a, b, h, s,i,n,m;
cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
cin>>a;
cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
cin>>b;
cout<<"число разбиений --> (n) =\n";
cin>>n;
h = ((b - a)/ (3*n)); cout<<"\nH="<<h;
s = Y(a)+Y(b);
m=3*n-1;
for (int i = 1; i<= m; i++)
{
x = a + h*i;
if (i%3 == 0)
s = s + 2 * Y(x);
else
s = s + 3 * Y(x);
}
s = s*3/8*h;
cout<<"\nИнтеграл = "<<s<<"\n";
}
long double Y(double p)
{
return ((p*p*p)+ (3*p*p)-2);
}
прям интересно за что начинающему минус
Вместо float и double используйте long double
Спасибо завтра опробую с вашими предложениями и вылажу результат
Препод сказал что именно в цикле и есть ошибка а где не говорит(((
Давайте решим уже проблему просмотров уже почти три сотни с учетом специфики данного задания очень много кому интересно решение