/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <conio.h>
#define n 1000
double f (double x, double y) // правая часть уравнения
{
return pow(-x,3)-x*y;
}
double ft (double x) // точное решение уравнение
{
return 2-pow(x,2)+pow(M_E,(-pow(x,2)/2));
}
double RK(double x, double y, double h) // функция вычисления следующей точки
{
double m1, m2, m3, m4; //
m1 = f(x, y);
m2 = f(x + (h/2), y + (h*m1/2));
m3 = f(x + (h/2), y + (h*m2/2));
m4 = f(x + h, y + h*m3);
return y + (h/6)*(m1+2*m2+2*m3+m4);
}
main()
{
setlocale(LC_ALL, "Rus");
double a, b, h, x, y[n], yh[n], e; // объявление переменных
int i;
a = 0; b = 2; y[0] = 3; yh[0] = 0; x = a; i = 0; e=0.01; // начальные условия
h=(b-a)/10; // задается начальный шаг
while (x<=b+h) // цикл вычисления точек функции с заданной точностью e
{
printf("%3d",i+1); // порядковый номер точки
printf ("\t x=%1.4f \t Y(x)=%9.6f", x, y[i]); // вывод приближенного значения функции
printf ("\t Y(x) точное =%9.6f", ft(x) ); // вывод точного значения функции
printf ("\t Разница=%1.6f", fabs(y[i]-ft(x)));
printf ("\n");
r1: y[i+1] = RK (x, y[i], h); // вычисление значения функции при шаге h
yh[i+1] = RK (x, y[i], h/2); // вычисления значения функции при шаге h/2
if ((fabs(y[i+1]-yh[i+1])/15)>=e) // сравнение погрешности результата с заданной точностью е
{
h=h/2; // если погрешность больще e - уменьшить текущий шаг вдвое
goto r1; // вернутся к вычислению функции
}
x=x+h; // переход к следующему аргументу
i=i+1;
}
printf ("На промежутке xЕ[%1.0f; %1.0f]\n", a, b);
printf ("было построено %d точек при заданной точности e= %1.3f", i-1, e); // вывод количества построенных точек
getch();
}