Как написать вложенный цикл for

Я запускаю программу, которая преобразует эйлерово приближение обыкновенного дифференциального уравнения. Чем меньше выбранный размер шага, тем точнее аппроксимация. Я могу заставить его работать для заданного размера шага, используя этот код:

#include <iostream>
using std::cout;

double f (double x, double t)
{
return t*x*x-t;
}

int main()
{
double x=0.0,t=0.0,t1=2.0;
int n=20;
double h = (t1-t) / double(n);

// ----- EULERS METHOD

for (int i=0; i<n; i++)
{
x += h*f(x,t);
t += h;
}

cout << h << " " << x << "\n";

}

Таким образом, этот код запускает аппроксимацию Эйлера для n = 20, которая соответствует размеру шага 0,1, и выводит размер шага вместе с аппроксимацией для x (2). Я хочу, чтобы top знал, как зацикливать этот код (для различных значений n), чтобы он выводил это, а затем все более и более малые размеры шагов с соответствующими приближениями.
то есть вывод примерно такой:

0.1   -0.972125
0.01  -0.964762
0.001 -0.9641

и т.п.

Так что я попробовал цикл for внутри цикла for, но он дал мне странный вывод экстремальных значений.

#include <iostream>
using std::cout;

double f (double x, double t)
{
return t*x*x-t;
}

int main()
{
double x=0.0,t=0.0,t1=2.0;

for (int n=20;n<40;n++)
{
double h = (t1-t)/n;
for (int i=0;i<n;i++)
{
x += h*f(x,t);
t += h;
}
cout << h << " " << x << "\n";

}

}

-5

Решение

Если я правильно понимаю, вы хотите выполнить этот первый фрагмент кода внутри вашей основной функции для разных значений n. Тогда ваша проблема с переменными x, t и t1, которые устанавливаются один раз перед циклом и никогда не сбрасываются. Вы хотите их внутри вашего внешнего цикла:

#include <iostream>

using std::cout;

double f( double x, double t )
{
return t * x * x - t;
}

int main()
{
for ( int n = 20; n < 40; n++ )
{
double x = 0.0, t = 0.0, t1 = 2.0;
double h = ( t1 - t ) / n;
for ( int i = 0; i < n; i++ )
{
x += h * f( x, t );
t += h;
}
cout << h << " " << x << "\n";
}
}

Использование функции для этого делает это более понятным:

#include <iostream>

using std::cout;

double f( double x, double t )
{
return t * x * x - t;
}

void eulers( const int n )
{
double x = 0.0, t = 0.0, t1 = 2.0;
double h = ( t1 - t ) / n;
for ( int i = 0; i < n; i++ )
{
x += h * f( x, t );
t += h;
}
cout << h << " " << x << "\n";
}

int main()
{
for ( int n = 20; n < 40; n++ )
{
eulers( n );
}
}

Надеюсь это поможет.

0

Другие решения

Других решений пока нет …