Автоматическим контролем шага

Вариант 1

Дифференциальное уравнение y0 x0 xn Точное решение ДУ

 

1. Метод Рунге - Кутта 4-ого порядка точности

Код программы для диф. уравнения 1-ого порядка:

 

#include<stdio.h>

#include<conio.h>

#include<math.h>

float f(float x,float y)

{

return (y*y -2*x)/(2*x*y);

}

int main()

{

clock_t start = clock();

 

float k1,k2,k3,k4,x,yi,h=0.1;

const float x0=1,xn=2;

float y0=3;

yi=y0;

for(x=x0;x<=xn;)

{

k1=h*f(x,yi);

k2=h*f(x+h/2,yi+k1/2);

k3=h*f(x+h/2,yi+k2/2);

k4=h*f(x+h,yi+k3);

yi=yi+(k1+2*k2+2*k3+k4)/6;

x+=h;

printf("\nx=%f",x);

printf("\nyi=%f",yi);

printf("\nyt=%f",sqrt(9*x -2*x*log(x)));

}

getch();

return 0;

}

 

printf("Work time = %.11Lf", (long double)((clock() -1.0L*start)/CLOCKS_PER_SEC));

system("pause");

return 0;

}

Результаты:

Work time = 0.6710

 

 

 

Метод Рунге - Кутта 4-ого порядка точности с

автоматическим контролем шага

Код программы для диф. уравнения 1-ого порядка:

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <iostream>

#include <time.h>

 

using namespace std;

 

const int N=20;

float func(float x, float y)

{

return y*y-2*x/(2*x*y);

}

 

void auto_method()

{

float x0, xn, h1, eps, h[N], x[N], y[N], k1[N], k2[N], k3[N], k4[N], yy[N];

int i=0;

eps=0.01;

x0=1;

xn=2;

h1=0.1;

h[0]=2*h1;

x[0]=1;

y[0]=3;

for (i=0; i<N-1; i++)

{

do

{

h[i]=h[i]/2;

x[i+1]=x[i]+h[i];

k1[i]=h[i]*func(x[i],y[i]);

k2[i]=h[i]*func(x[i]+h[i]/2,y[i]+k1[i]/2);

k3[i]=h[i]*func(x[i]+h[i]/2,y[i]+k2[i]/2);

k4[i]=h[i]*func(x[i]+h[i],y[i]+k3[i]);

y[i+1]=y[i]+(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6;

}

while(fabs(2*(k1[i]-k2[i]-k3[i]+k4[i])/3)>eps);

if(fabs(2*(k1[i]-k2[i]-k3[i]+k4[i])/3)<(eps/32))

h[i+1]=4*h[i];

else

h[i+1]=2*h[i];

}

for(i=0;i<N-1;i++)

{

yy[i]=sqrt(9*x[i] -2*x[i]*log(x[i])) ;

printf("x=%.4f ", x[i]);

printf("yi=%.4f ", y[i]);

printf("yt=%.4f h=%.4f ", yy[i], h[i]);

printf("|yi-yt|=%.4f ", fabs(y[i]-yy[i]));

printf("\n");

}

}

 

 

int main()

{

clock_t start = clock();

auto_method();

printf("Work time = %.11Lf", (long double)((clock() -1.0L*start)/CLOCKS_PER_SEC));

system("pause");

return 0;

}

Результаты: