Студопедия — Задание №2 Решение систем обыкновенных дифференциальных уравнений
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Задание №2 Решение систем обыкновенных дифференциальных уравнений






#include <stdio.h>

#include <math.h>

const int n = 2; // укажите количество уравнений в вашем варианте

 

double f1 (double y[], double time) {

return y[1]; // введите первую правую часть

}

double f2 (double y[], double time) {

return (1.0-y[0]*y[0])*y[1]-y[0]; // введите вторую правую часть

}

//double f3 (double x[], double time) {

// return; // введите третью правую часть

//}

 

double (* p[n]) (double [], double);

 

void main () {

const int m = 4;

FILE * fil;

double y[n] = {2.0,0.0 }; // укажите начальные значения параметров

p[0] = f1; p[1] = f2; //p[2] = f3;

double t = 0.0, tmax = 0.1, tau = 0.01;

double r[m][n], yy[n];

int i;

fopen_s (&fil, "zadanie2.dat", "w");

 

// Метод Эйлера

printf (" Metod Ejler "); fprintf (fil, " Метод Эйлера ");

t = 0.0; y[0] =2.0; y[1] = 0.0; // y[2] = 0.0; // укажите начальные значения параметров

printf ("time = %1.2f\n ", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.8f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

do {

for (i=0; i<n; i++) yy[i] = y[i] + tau*(p[i](y,t));

for (i=0; i<n; i++) y[i] = yy[i];

t += tau;

printf ("time = %1.2f\n ", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.8f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

} while (t <= tmax);

// Метод Рунге-Кутта 2

printf ("\n Metod Runge-Kutta 2 "); fprintf (fil, "\n Метод Рунге-Кутты 2 ");

t = 0.0; y[0] = 2.0; y[1] =0.0; //y[2] = 0.0; // укажите начальные значения параметров

double ff[n];

printf ("time = %1.2f\n ", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.8f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

do {

for (i=0; i<n; i++) yy[i] = y[i]+0.5*tau*(p[i](y,t));

for (i=0; i<n; i++) ff[i] = (p[i](yy,t+tau*0.5));

for (i=0; i<n; i++) y[i] += tau*ff[i];

t += tau;

printf ("time = %1.2f\n ", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.8f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

} while (t <= tmax);

// Метод Рунге-Кутта 4

printf ("\n Metod Runge-Kutta 4 "); fprintf (fil, "\n Метод Рунге-Кутты 4 ");

t = 0.0; y[0] =2.0; y[1] =0.0; //y[2] = 0.0; // укажите начальные значения параметров

printf ("time = %1.2f\n ", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.8f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

do {

for (i=0; i<n; i++) r[0][i] = tau*(p[i](y,t));

for (i=0; i<n; i++) yy[i] = y[i]+0.5*r[0][i];

for (i=0; i<n; i++) r[1][i] = tau*(p[i](yy,t+0.5*tau));

for (i=0; i<n; i++) yy[i] = y[i]+0.5*r[1][i];

for (i=0; i<n; i++) r[2][i] = tau*(p[i](yy,t+0.5*tau));

for (i=0; i<n; i++) yy[i] = y[i]+r[2][i];

for (i=0; i<n; i++) r[3][i] = tau*(p[i](yy,t+tau));

for (i=0; i<n; i++) y[i] += (r[0][i]+2.0*r[1][i]+2.0*r[2][i]+r[3][i])/6.0;

t += tau;

printf ("time = %1.2f\n", t); fprintf (fil, "time = %1.2f\n ", t);

for (i=0; i<n; i++) {

printf ("y[%d] = %2.10f ", i, y[i]); fprintf (fil, "y[%d] = %2.8f ", i, y[i]);

}

printf ("\n"); fprintf (fil, "\n");

} while (t <= tmax);

fclose (fil);

}

 

решение

 

Метод Эйлера time = 0.00

y[0] = 2.00000000 y[1] = 0.00000000

time = 0.01

y[0] = 2.00000000 y[1] = -0.02000000

time = 0.02

y[0] = 1.99980000 y[1] = -0.03940000

time = 0.03

y[0] = 1.99940600 y[1] = -0.05821632

time = 0.04

y[0] = 1.99882384 y[1] = -0.07646527

time = 0.05

y[0] = 1.99805918 y[1] = -0.09416315

time = 0.06

y[0] = 1.99711755 y[1] = -0.11132615

time = 0.07

y[0] = 1.99600429 y[1] = -0.12797037

time = 0.08

y[0] = 1.99472459 y[1] = -0.14411173

time = 0.09

y[0] = 1.99328347 y[1] = -0.15976600

time = 0.10

y[0] = 1.99168581 y[1] = -0.17494870

time = 0.11

y[0] = 1.98993632 y[1] = -0.18967516

 

Метод Рунге-Кутты 2 time = 0.00

y[0] = 2.00000000 y[1] = 0.00000000

time = 0.01

y[0] = 1.99990000 y[1] = -0.01970000

time = 0.02

y[0] = 1.99960596 y[1] = -0.03881613

time = 0.03

y[0] = 1.99912364 y[1] = -0.05736441

time = 0.04

y[0] = 1.99845863 y[1] = -0.07536086

time = 0.05

y[0] = 1.99761638 y[1] = -0.09282138

time = 0.06

y[0] = 1.99660217 y[1] = -0.10976180

time = 0.07

y[0] = 1.99542111 y[1] = -0.12619779

time = 0.08

y[0] = 1.99407817 y[1] = -0.14214484

time = 0.09

y[0] = 1.99257817 y[1] = -0.15761824

time = 0.10

y[0] = 1.99092577 y[1] = -0.17263309

time = 0.11

y[0] = 1.98912548 y[1] = -0.18720422

 

Метод Рунге-Кутты 4 time = 0.00

y[0] = 2.00000000 y[1] = 0.00000000

time = 0.01

y[0] = 1.99990099 y[1] = -0.01970267

time = 0.02

y[0] = 1.99960789 y[1] = -0.03882136

time = 0.03

y[0] = 1.99912646 y[1] = -0.05737210

time = 0.04

y[0] = 1.99846229 y[1] = -0.07537089

time = 0.05

y[0] = 1.99762083 y[1] = -0.09283365

time = 0.06

y[0] = 1.99660735 y[1] = -0.10977620

time = 0.07

y[0] = 1.99542699 y[1] = -0.12621419

time = 0.08

y[0] = 1.99408470 y[1] = -0.14216314

time = 0.09

y[0] = 1.99258530 y[1] = -0.15763834

time = 0.10

y[0] = 1.99093346 y[1] = -0.17265487

time = 0.11

y[0] = 1.98913368 y[1] = -0.18722757

 

 

Задпние №3 решение уравнений в частных производных

#include <stdio.h>

#include <math.h>

 

const double L = 200.0, h = 1.0, tau = 0.1, u0 = 22.0;

const double tn = 0.0, tmax = 10000.0, a = 1.0;

 

double g0 (double x) {

return sin(x+0.480); // Введите функцию g0(x)

}

double f0 (double time) {

return 0.46180;// Введите функцию f0(t)

}

double f1 (double time) {

return 3.0*time+0.8820; // Введите функцию f1(t)

}

 

int main () {

FILE * fil;

// блок подготовки

int n = (int) (L / h) + 1;

double x = 0.0;

double * u = new double [n];

double time = tn;

fopen_s (&fil, "teplo.dat", "w");

// начальные значения температур

u[0] = f0 (time);; //fi1(time);

for (int i=1; i<n-1; i++) { u[i] = g0 (x); x += h; }

u[n-1] = f1 (time); //fi2(time);

 

// основной расчет

double upr, uu, R = a*a*tau/(h*h);

do {

upr = u[0];

for (int i=1; i<n-1; i++) {

uu = u[i];

u[i] += R*(upr-2.0*u[i]+u[i+1]);

upr = uu;

}

u[0] = f0(time+tau);

u[n-1] = f1(time+tau);

time += tau;

} while (time <= tmax);

// вывод вычесленных значений температур

fprintf (fil, "\n вывод вычесленных значений температур\n");

for (int i=0; i<n; i++) {

fprintf (fil, "u[%d]=%2.8f\t", i, u[i]);

if (!((i+1)%3)) fprintf (fil, "\n");

}

fprintf (fil, "\n");

printf ("End calculus\n");

delete [] u;

fclose (fil);

return 0;

}

 

Результаты вычислений

вывод вычесленных значений температур

u[0]=0.46180000 u[1]=60.77452300 u[2]=121.09970379

u[3]=181.44980078 u[4]=241.83727365 u[5]=302.27458393

u[6]=362.77419567 u[7]=423.34857605 u[8]=484.01019599

u[9]=544.77153080 u[10]=605.64506077 u[11]=666.64327182

u[12]=727.77865608 u[13]=789.06371257 u[14]=850.51094776

u[15]=912.13287620 u[16]=973.94202114 u[17]=1035.95091514

u[18]=1098.17210068 u[19]=1160.61813073 u[20]=1223.30156941

u[21]=1286.23499256 u[22]=1349.43098833 u[23]=1412.90215778

u[24]=1476.66111549 u[25]=1540.72049011 u[26]=1605.09292499

u[27]=1669.79107872 u[28]=1734.82762573 u[29]=1800.21525685

u[30]=1865.96667989 u[31]=1932.09462022 u[32]=1998.61182128

u[33]=2065.53104518 u[34]=2132.86507324 u[35]=2200.62670654

u[36]=2268.82876644 u[37]=2337.48409517 u[38]=2406.60555629

u[39]=2476.20603526 u[40]=2546.29843998 u[41]=2616.89570124

u[42]=2688.01077331 u[43]=2759.65663439 u[44]=2831.84628710

u[45]=2904.59275903 u[46]=2977.90910319 u[47]=3051.80839846

u[48]=3126.30375012 u[49]=3201.40829031 u[50]=3277.13517845

u[51]=3353.49760171 u[52]=3430.50877550 u[53]=3508.18194384

u[54]=3586.53037987 u[55]=3665.56738619 u[56]=3745.30629535

u[57]=3825.76047025 u[58]=3906.94330450 u[59]=3988.86822287

u[60]=4071.54868164 u[61]=4154.99816900 u[62]=4239.23020544

u[63]=4324.25834406 u[64]=4410.09617100 u[65]=4496.75730574

u[66]=4584.25540143 u[67]=4672.60414528 u[68]=4761.81725883

u[69]=4851.90849831 u[70]=4942.89165489 u[71]=5034.78055504

u[72]=5127.58906079 u[73]=5221.33107000 u[74]=5316.02051667

u[75]=5411.67137116 u[76]=5508.29764048 u[77]=5605.91336852

u[78]=5704.53263629 u[79]=5804.16956213 u[80]=5904.83830197

u[81]=6006.55304949 u[82]=6109.32803637 u[83]=6213.17753244

u[84]=6318.11584586 u[85]=6424.15732334 u[86]=6531.31635024

u[87]=6639.60735076 u[88]=6749.04478809 u[89]=6859.64316452

u[90]=6971.41702156 u[91]=7084.38094008 u[92]=7198.54954040

u[93]=7313.93748238 u[94]=7430.55946552 u[95]=7548.43022902

u[96]=7667.56455184 u[97]=7787.97725280 u[98]=7909.68319056

u[99]=8032.69726370 u[100]=8157.03441074 u[101]=8282.70961016

u[102]=8409.73788038 u[103]=8538.13427978 u[104]=8667.91390668

u[105]=8799.09189933 u[106]=8931.68343586 u[107]=9065.70373423

u[108]=9201.16805221 u[109]=9338.09168728 u[110]=9476.48997658

u[111]=9616.37829684 u[112]=9757.77206424 u[113]=9900.68673437

u[114]=10045.13780207 u[115]=10191.14080134 u[116]=10338.71130517

u[117]=10487.86492547 u[118]=10638.61731283 u[119]=10790.98415644

u[120]=10944.98118387 u[121]=11100.62416092 u[122]=11257.92889141

u[123]=11416.91121701 u[124]=11577.58701700 u[125]=11739.97220808

u[126]=11904.08274413 u[127]=12069.93461599 u[128]=12237.54385119

u[129]=12406.92651374 u[130]=12578.09870382 u[131]=12751.07655755

u[132]=12925.87624667 u[133]=13102.51397829 u[134]=13281.00599459

u[135]=13461.36857246 u[136]=13643.61802327 u[137]=13827.77069249

u[138]=14013.84295934 u[139]=14201.85123653 u[140]=14391.81196984

u[141]=14583.74163779 u[142]=14777.65675126 u[143]=14973.57385316

u[144]=15171.50951800 u[145]=15371.48035152 u[146]=15573.50299032

u[147]=15777.59410139 u[148]=15983.77038179 u[149]=16192.04855815

u[150]=16402.44538628 u[151]=16614.97765075 u[152]=16829.66216442

u[153]=17046.51576801 u[154]=17265.55532964 u[155]=17486.79774438

u[156]=17710.25993375 u[157]=17935.95884530 u[158]=18163.91145208

u[159]=18394.13475217 u[160]=18626.64576819 u[161]=18861.46154680

u[162]=19098.59915820 u[163]=19338.07569561 u[164]=19579.90827473

u[165]=19824.11403328 u[166]=20070.71013041 u[167]=20319.71374621

u[168]=20571.14208113 u[169]=20825.01235548 u[170]=21081.34180885

u[171]=21340.14769957 u[172]=21601.44730415 u[173]=21865.25791673

u[174]=22131.59684848 u[175]=22400.48142706 u[176]=22671.92899604

u[177]=22945.95691431 u[178]=23222.58255549 u[179]=23501.82330739

u[180]=23783.69657135 u[181]=24068.21976171 u[182]=24355.41030517

u[183]=24645.28564021 u[184]=24937.86321649 u[185]=25233.16049424

u[186]=25531.19494364 u[187]=25831.98404422 u[188]=26135.54528427

u[189]=26441.89616017 u[190]=26751.05417583 u[191]=27063.03684204

u[192]=27377.86167584 u[193]=27695.54619994 u[194]=28016.10794205

u[195]=28339.56443429 u[196]=28665.93321254 u[197]=28995.23181581

u[198]=29327.47778567 u[199]=29662.68866552 u[200]=30000.88200006

 

задание№4

#include <stdio.h>

#include <math.h>

 

void main () {

const double h = 0.2, xmax = 1.0, ymax = 1.0;

const double eps = 0.01, Pi = 3.1415;

const int kmax = 200;

FILE * f;

int n = (int) (xmax / h) + 1;

 

double ** u;

u = new double * [n];

for (int i=0; i<n; i++) u[i] = new double [n];

fopen_s (&f, "station.dat", "w");

// Стороны AB и CD

double y = 0.0;

for (int j=0; j<n; j++) {

u[0][j] =0.0; // Введите функцию на стороне AB

u[n-1][j] = 50.0*y*(1-pow(y,2.0)); // Введите функцию на стороне CD

y += h;

}

// Стороны AD и BC

double x = 0.0;

for (int i=0; i<n; i++) {

u[i][0] = 50.0*x*(1-x); // Введите функцию на стороне AD

u[i][n-1] =50.0*x*(1-x); // Введите функцию на стороне BC

x += h;

}

// Начальные значения искомой функции внутри области

for (int i=1; i<n-1; i++)

for (int j=1; j<n-1; j++) u[i][j] = 0.0;

 

int k = 0;

do {

for (int i=1; i<n-1; i++)

for (int j=1; j<n-1; j++) {

u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+u[i][j+1]+u[i][j-1]);

}

k++;

} while (k<kmax);

fprintf (f, "Вычисленные значения\n");

for (int j=n-1; j>=0; j--) {

for (int i=0; i<n; i++) {

printf ("%2.4f\t", u[i][j]);

fprintf (f, "%2.4f\t", u[i][j]);

}

printf ("\n"); fprintf (f, "\n");

}

 

 

for (int i=0; i<n; i++) delete [] u[i];

delete [] u;

fclose (f);

}

Вычисленные значения

0.0000 8.0000 12.0000 12.0000 8.0000 0.0000

0.0000 5.3947 9.0948 10.8992 11.7296 14.4000

0.0000 4.4839 8.0853 10.7722 13.6192 19.2000

0.0000 4.4555 7.9904 10.4853 12.7748 16.8000

0.0000 5.3478 8.9355 10.4039 10.1947 9.6000

0.0000 8.0000 12.0000 12.0000 8.0000 0.0000

 

Задание№5

 

 

#include <stdio.h>

 

const int n = 3;

const int n1 = 2;

 

int main () {

double x[n] = { 0.0 };

double a[n][n] = { {15.5,-13.1,37.0}, {40.1,7.2,-11.9 },{11.5,54.8,23.7}}; //Введите коэффициенты при x, y, z

double b[n] = {16.79,-53.23,141.57 }; // Введите столбец свободных членов

 

FILE * f;

fopen_s (&f, "gauss.dat", "w");

 

// Печать исходной системы

fprintf (f, "Исходная линейная система\n");

for (int l=0; l<n; l++) {

for (int m=0; m<n; m++) {

fprintf (f, "%2.3f * x[%d] ", a[l][m], m);

if ((m<n-1) && (a[l][m+1]>=0.0)) fprintf (f, "+");

if (m==(n-1)) fprintf (f, " = ");

}

fprintf (f, "%2.3f\n", b[l]);

}

 

// Прямой ход метода Гаусса

double w[n1];

for (int i=1; i<n; i++) {

int l = i - 1;

for (int j=0; j<n-i; j++) w[j] = -a[j+i][l] / a[l][l];

for (int k=i; k<n; k++) {

for (int j=0; j<n; j++) a[k][j] += a[l][j]*w[k-i];

b[k] += b[l]*w[k-i];

}

}

 

// Печать системы, приведенной к треугольному виду

fprintf (f, "\nСистема, приведенная к треугольному виду\n");

for (int l=0; l<n; l++) {

for (int m=0; m<n; m++) {

fprintf (f, "%2.3f * x[%d] ", a[l][m], m);

if ((m<n-1) && (a[l][m+1]>=0.0)) fprintf (f, "+");

if (m==(n-1)) fprintf (f, " = ");

}

fprintf (f, "%2.3f\n", b[l]);

}

 

// Обратный ход метода Гаусса

double sum;

for (int j=n-1; j>=0; j--) {

sum = 0.0;

for (int i=j; i<n-1; i++)

sum += a[j][i+1]*x[i+1];

x[j] = (b[j] - sum) /a[j][j];

}

 

// Печать результатов

printf ("Solution - \n");

fprintf (f, "\nВычисленные решения системы\n");

for (int i=0; i<n; i++) {

printf ("x[%d] = %2.4f ", i, x[i]);

fprintf (f, "x[%d] = %2.4f ", i, x[i]);

}

printf ("\n"); fprintf (f, "\n");

 

fclose (f);

return 0;

}

 

Исходная линейная система

15.500 * x[0] -13.100 * x[1] +37.000 * x[2] = 16.790

40.100 * x[0] +7.200 * x[1] -11.900 * x[2] = -53.230

11.500 * x[0] +54.800 * x[1] +23.700 * x[2] = 141.570

 

Система, приведенная к треугольному виду

15.500 * x[0] -13.100 * x[1] +37.000 * x[2] = 16.790

0.000 * x[0] +41.091 * x[1] -107.623 * x[2] = -96.667

0.000 * x[0] +0.000 * x[1] +165.233 * x[2] = 280.896

 

Вычисленные решения системы

x[0] = -1.2000 x[1] = 2.1000 x[2] = 1.7000

 







Дата добавления: 2015-08-27; просмотров: 289. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Огоньки» в основной период В основной период смены могут проводиться три вида «огоньков»: «огонек-анализ», тематический «огонек» и «конфликтный» огонек...

Упражнение Джеффа. Это список вопросов или утверждений, отвечая на которые участник может раскрыть свой внутренний мир перед другими участниками и узнать о других участниках больше...

Влияние первой русской революции 1905-1907 гг. на Казахстан. Революция в России (1905-1907 гг.), дала первый толчок политическому пробуждению трудящихся Казахстана, развитию национально-освободительного рабочего движения против гнета. В Казахстане, находившемся далеко от политических центров Российской империи...

Принципы резекции желудка по типу Бильрот 1, Бильрот 2; операция Гофмейстера-Финстерера. Гастрэктомия Резекция желудка – удаление части желудка: а) дистальная – удаляют 2/3 желудка б) проксимальная – удаляют 95% желудка. Показания...

Ваготомия. Дренирующие операции Ваготомия – денервация зон желудка, секретирующих соляную кислоту, путем пересечения блуждающих нервов или их ветвей...

Билиодигестивные анастомозы Показания для наложения билиодигестивных анастомозов: 1. нарушения проходимости терминального отдела холедоха при доброкачественной патологии (стенозы и стриктуры холедоха) 2. опухоли большого дуоденального сосочка...

Studopedia.info - Студопедия - 2014-2024 год . (0.007 сек.) русская версия | украинская версия