Я запускаю программу, которая преобразует эйлерово приближение обыкновенного дифференциального уравнения. Чем меньше выбранный размер шага, тем точнее аппроксимация. Я могу заставить его работать для заданного размера шага, используя этот код:
#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";
}
}
Если я правильно понимаю, вы хотите выполнить этот первый фрагмент кода внутри вашей основной функции для разных значений 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 );
}
}
Надеюсь это поможет.
Других решений пока нет …