Я пытаюсь реализовать правило трапеции, которое использует предыдущие оценки функций, чтобы избежать избыточных вычислений. Две вещи: а) результаты вычислений не сходятся, и я немного не знаю, почему. Я опубликую математику, объясняющую, почему я считаю, что алгоритм должен давать сходимость, если это необходимо, и б) цикл do while завершается при n = 8, и я также не смог его выяснить; он должен работать до n> 128? (n — число подинтервалов). Мой код ниже. Заранее спасибо!
void NestedTrap(int n) //Trapezoidal with reuse of function evaluations
{
double a,b; //interval end points
double x[n+1]; //equally spaced nodes
double c[n]; //midpoints
double T; //Initial integral evaluation
double T2; //Evaluation with reuse of previous function evaluations
double h, h2; //step sizes for T and T2
double temp1, temp2;
std::cout <<"Enter interval end points (lesser first; enter 999 for pi & 999.2 for pi/2 & 999.4 for pi/4): ";
std::cin >> a >> b;
if (b == 999)
{
b = M_PI;
}
if (a == 999)
{
a = M_PI;
}
if (b == 999.4)
{
b = M_PI/4;
}
if (a == 999.4)
{
a = M_PI/4;
}
if (b == 999.2)
{
b = M_PI/2;
}
if (a == 999.2)
{
a = M_PI/2;
}
h = (b-a)/n;
T = 0;
temp1 = 0;
temp2 = 0;
for (int i=0; i<=n; i++)
{
x[i] = 0;
}for (int i=0; i<n; i++)
{
x[i+1] = x[i] + h;
}
for (int i=1; i<n; i++)
{
temp1 += I1(x[i]);
}
T = (h/2)*exp(x[0]) + (h/2)*exp(x[n]) + (h*temp1);
std::cout << "T_" << n <<": " << T << std::endl;
do
{
temp2 = 0;
n = 2*n;
h2 = (b-a)/(n);
for (int i=0; i<n; i++)
{
c[i] = 0;
}
for (int i=1; i<=n; i++)
{
c[i] = a + h2*(i-0.5);
//std::cout << c[i] << std::endl;
}
for (int i=0; i<n; i++)
{
temp2 += exp(c[i]);
}
T2 = (T/2) + h2*temp2;
std::cout << "T_" << n <<": " << T2 << std::endl;
T = T2;
} while (n <= 128);
}
Вы создаете массивы размера n
Вот
double x[n+1]; //equally spaced nodes
double c[n]; //midpoints
(обратите внимание, что это не действительно C ++)
тогда вы увеличиваете n
Вот:
n = 2*n;
тогда вы пишете за концом вашего массива здесь:
for (int i=0; i<n; i++)
{
c[i] = 0;
}
что вызывает неопределенное поведение (возможно, перезаписывает некоторые другие переменные)
Других решений пока нет …