#include<iostream>
#include<cmath>
using namespace std;
double psi(double x)
{
return (2.7 + x) / (5.7 - 0.9 * x + x * x);
}
double fi(double x)
{
return cos(x) * cos(x);
}
double func(double x, double t)
{
return psi(x) * fi(x + t / (1 + x * x));
}
double funcGa(double t)
{
double a;
double x = a;
return psi(x) * fi(x + t / (1 + x * x));
}
double funcGb(double t)
{
double b;
double x = b;
return psi(x) * fi(x + t / (1 + x * x));
}
double integral(double a, double b, double e, double t)
{
double h, J1, J2;
int i, n;
n = 1;
h = (b - a) / n;
J2 = h / 3 * (2 * func(a + 2 * h,
t) + 4 * func(a + h) + (funcGa(a) + funcGb(b)) / 2);
do
{
J1 = J2;
n = n * 2;
h = (b - a) / n;
J2 = 0;
for (i = 1; i <= n / 2 - 1; i++)
for (j = 1; j <= n / 2; j++)
J2 = 2 * func(a + 2 * i * h, t) + 4 * func(a + (2 * j - 1) * h,
t) + (funcGa(a) + funcGb(b)) / 2;
J2 = J2 * h / 3;
}
while (fabs(J2 - J1) > e);
return J2;
}
int main()
{
double a, b, e;
int m, i;
double* t;
t = new double[m];
cin >> a >> b >> e >> m;
for (i = 0; i < m; i++)
{
cin >> t[i];
cout << integral(a, b, e, t[i]) << endl;
}
}
У вас пропущен один аргумент, не объявлена переменная j
.
Но это ерунда, потому что -
double funcGa(double t)
{
double a;
double x = a;
return psi(x) * fi(x + t / (1 + x * x));
}
Ну и что посчитает такая функция? Есть некоторое a
, с неопределенным значением - в нем может быть что угодно. И вы начинаете считать...
Больше всего это напоминает работу Переца на поломанном "Мерседесе" у Стругацких...
ошибка как минимум здесь
J2=h/3*(2*func(a+2*h,t)+4*func(a+h)+(funcGa(a)+funcGb(b))/2);
второй вызов func
содержит один аргумент, а по сигнатуре функции должно быть два. Либо забыли один аргумент, либо вызываете не ту функцию.
Вот ваше решение. Откровенно говоря, отдельно интегралы не считал, но вроде должно работать...
double F(double x, double t)
{
double z = cos(x+t/(1+x*x));
return ((2.7*x)/((x-0.9)*x+5.7))*z*z;
}
double Simpson(double a, double b, double t, double eps, double (*f)(double,double))
{
double N = 4.;
double sum1 = 0., sum2 = 0.;
double x, h;
double index1, index2;
unsigned int i;
double func;
for (;;) {
h = (b-a)/N;
sum1 = sum2 = -(f(a,t)+f(b,t));
index1 = index2 = 4.;
i = 0;
for(x = a; x <= b+h/2.; x+=h) {
sum1 += (index1 = 6.-index1)*(func=f(x,t));
if (i++%2==0) {
sum2 += (index2 = 6.-index2)*func;
};
};
if (fabs((sum1-2.*sum2)/sum1)<=eps) return (h*sum1)/3.+h*(2.*sum2-sum1)/45.; else N*=2.;
};
};
int main(int argc, const char * argv[])
{
double a, b, e;
cout << "a = ";
cin >> a;
cout << "b = ";
cin >> b;
cout << "eps = ";
cin >> e;
int m;
cout << "m = ";
cin >> m;
double* t = new double[m];
double* y = new double[m];
for (int i = 0; i < m; i++)
{
cout << "t["<<(i+1)<<"] = ";
cin >> t[i];
y[i] = Simpson(a,b,t[i],e,F);
cout << "y[" << (i+1) << "] = " << y[i] << endl;
}
}
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Перестал работать getch()Компилирует без ошибок, а работать, как следует не хочет, не реагирует на нажатие клавиш
Перечитал весь гугл по мвс получаю с помощью методов класса данные, в формате [x,y;x,y;