Студопедия — Задание №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; просмотров: 287. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

ОПРЕДЕЛЕНИЕ ЦЕНТРА ТЯЖЕСТИ ПЛОСКОЙ ФИГУРЫ Сила, с которой тело притягивается к Земле, называется силой тяжести...

СПИД: морально-этические проблемы Среди тысяч заболеваний совершенно особое, даже исключительное, место занимает ВИЧ-инфекция...

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

Методы прогнозирования национальной экономики, их особенности, классификация В настоящее время по оценке специалистов насчитывается свыше 150 различных методов прогнозирования, но на практике, в качестве основных используется около 20 методов...

Методы анализа финансово-хозяйственной деятельности предприятия   Содержанием анализа финансово-хозяйственной деятельности предприятия является глубокое и всестороннее изучение экономической информации о функционировании анализируемого субъекта хозяйствования с целью принятия оптимальных управленческих...

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

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