Изучение свойств и особенностей реализации и применения приближённых методов решения дифференциального уравнения

Страницы работы

Содержание работы

Министерство образования Республики Беларусь

Учреждение образования: Белорусский государственный университет транспорта

Электротехнический факультет

Кафедра «Высшая математика»

Глобальное домашнее задание

по теме: «Операционное исчисление»

Выполнил:

студент гр. ЭС-21

Рубцов К.М.

Проверил:

доцент

Дудко С. А.

2005

Цель работы: изучить свойства и особенности реализации и применения приближённых методов решения дифференциального уравнения (метод Эйлера, метод Рунге-Кутта).

Задание.

Решение.

Листинг 1 (метод Эйлера):

#include <stdio.h>

#include <math.h>

typedef struct _tagXY

 {

  float x,y;

 } TXY;

inline float doubleFunc(float x,float y,float a,float b)

 {

  return cos(y)/(a+x)+b*y*y;

 }

int recurseCalc(float prevx,float prevy,float a,float b,float xborder,float xstep,int curpoint,TXY *table)

 {

  float nowx,nowy;

  if((nowx=prevx+xstep)>(xborder+1e-4)) return (curpoint-1);

  nowy=prevy+xstep*doubleFunc(prevx,prevy,a,b);

  table[curpoint].x=nowx;

  table[curpoint].y=nowy;

  return recurseCalc(nowx,nowy,a,b,xborder,xstep,curpoint+1,table); 

 };

void main(void)

 {

  TXY tabtable[600];

  float a,b,x0,y0,xborder,xstep;

  int num;

  register int cyc;

  printf("Введите параметры уравнения a, b : ");

  scanf("%f %f",&a,&b);

  printf("Укажите шаг вычислений : ");

  scanf("%f",&xstep);

  printf("Введите начальные условия (x0,y0) : ");

  scanf("%f %f",&x0,&y0);

  printf("Укажите правую границу отрезка пробора [x0,z] : ");

  scanf("%f",&xborder);

  tabtable[0].x=x0;

  tabtable[0].y=y0;

  num=recurseCalc(x0,y0,a,b,xborder,xstep,1,tabtable);

  printf("|#   |    X[i]    |    Y[i]    |\n");

  for(cyc=0;cyc<=num;cyc++)

   printf("|%4d|%12.4f|%12.4f|\n",cyc,tabtable[cyc].x,tabtable[cyc].y); 

  return;

 }

Консоль:

Введите параметры уравнения a, b : 0.7 0.3

Укажите шаг вычислений : 0.1

Введите начальные условия (x0,y0) : 0 0

Укажите правую границу отрезка пробора [x0,z] : 1

|#   |    X[i]    |    Y[i]    |

|   0|      0.0000|      0.0000|

|   1|      0.1000|      0.1429|

|   2|      0.2000|      0.2672|

|   3|      0.3000|      0.3765|

|   4|      0.4000|      0.4738|

|   5|      0.5000|      0.5614|

|   6|      0.6000|      0.6414|

|   7|      0.7000|      0.7154|

|   8|      0.8000|      0.7846|

|   9|      0.9000|      0.8503|

|  10|      1.0000|      0.9132|

Листинг 2 (метод Рунге-Кутта):

#include <stdio.h>

#include <math.h>

typedef struct _tagXY

 {

  float x,y;

 } TXY;

//Individual data

inline float doubleFunc(float x,float y,float sy)

 {

  return (y*sy-cos(x));

 };

//------------------------ 

int recurseCalc(float prevx,float prevy,float prevsy,float xborder,float xstep,int curpoint,TXY *table)

 {

  float nowx,nowy,nowsy,k1,k2,k3,k4,K1,K2,K3,K4;

  if((nowx=prevx+xstep)>(xborder+1e-4)) return (curpoint-1);

  K1=doubleFunc(prevx,prevy,prevsy);

  k1=prevsy;

  K2=doubleFunc(prevx+xstep/2,prevy+xstep*k1/2,prevsy+xstep*K1/2);

  k2=prevsy+xstep*K1/2;

  K3=doubleFunc(prevx+xstep/2,prevy+xstep*k2/2,prevsy+xstep*K2/2);

  k3=prevsy+xstep*K2/2;

  K4=doubleFunc(prevx+xstep,prevy+xstep*k3,prevsy+xstep*K3);     

  k4=prevsy+xstep*K3;

  nowsy=prevsy+xstep/6*(K1+2*K2+2*K3+K4);

  nowy=prevy+xstep/6*(k1+2*k2+2*k3+k4); 

  table[curpoint].x=nowx;

  table[curpoint].y=nowy;

  return recurseCalc(nowx,nowy,nowsy,xborder,xstep,curpoint+1,table); 

 };

void main(void)

 {

  TXY tabtable[600];

  float x0,y0,sy0,xborder,xstep;

  int num;

  register int cyc; 

  printf("Укажите шаг вычислений : ");

  scanf("%f",&xstep);

  printf("Введите начальные условия (x0,y0,y'0) : ");

  scanf("%f %f %f",&x0,&y0,&sy0);

  printf("Укажите правую границу отрезка пробора [x0,z] : ");

  scanf("%f",&xborder);

  tabtable[0].x=x0;

  tabtable[0].y=y0;

  num=recurseCalc(x0,y0,sy0,xborder,xstep,1,tabtable);

  printf("|#   |    X[i]    |    Y[i]    |\n");

  for(cyc=0;cyc<=num;cyc++)

   printf("|%4d|%12.4f|%12.4f|\n",cyc,tabtable[cyc].x,tabtable[cyc].y); 

  return;

 }

Консоль:

Укажите шаг вычислений : 0.1

Введите начальные условия (x0,y0,y'0) : 0 0 1

Укажите правую границу отрезка пробора [x0,z] : 1

|#   |    X[i]    |    Y[i]    |

|   0|      0.0000|      0.0000|

|   1|      0.1000|      0.0952|

|   2|      0.2000|      0.1812|

|   3|      0.3000|      0.2589|

|   4|      0.4000|      0.3290|

|   5|      0.5000|      0.3921|

|   6|      0.6000|      0.4487|

|   7|      0.7000|      0.4995|

|   8|      0.8000|      0.5450|

|   9|      0.9000|      0.5859|

|  10|      1.0000|      0.6229|

Похожие материалы

Информация о работе

Тип:
Домашние задания
Размер файла:
42 Kb
Скачали:
0