МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра КСУ ОТЧЕТ по лабораторной работе № 6 по дисциплине «Программирование и основы алгоритмизации» ТЕМА: Разработка программы численного решения обыкновенных дифференциальных уравнений Студенты гр. 0404 Преподаватель Санкт-Петербург 2021 Цель работы: освоение численного решения обыкновенных дифференциальных уравнений Методика проведения работы 1. Нарисовать блок-схему алгоритма численного решения нелинейного алгебраического уравнения вила 𝑑𝑦 𝑑𝑥 = ax3 + bx2 + cx + d методом Эйлера и методом Рунге-Кутта 2-ого порядка при нулевых начальных условиях y(x0=0)=y0=0. Значение коэффициентов a,b,c,d принимаются в соответствии с вариантом задания, представленным в табл. 1 с значением шага интегрирования ℎ ≤ 0.1. 2. Написать на языке программирования С и отладить программу численного решения обыкновенного дифференциального уравнения. 3. Графики функций 𝑑𝑦 𝑑𝑥 = ax3 + bx2 + cx + d, y=f(x) и y=f *(x). 4. Сделать вывод по проделанной работе. Таблица 1 № варианта a b c d 6 0.004 -0.263 0.53 64 Ход работы Код файла main.m: clear,clc,close; a=0.004; b=-0.263; c=0.53; d=64; polynom=[a b c d]; X=0; Y=0; h=0.1; y_0=0; x_0=0; starts=[x_0,y_0]; interval=[0 30 h]; method_name='method_name'; while true m=menu('Программа решения ОДУ', 'Построить график','Метод Эйлера','Метод Рунге-Кутта','Записать расчеты в файл','Выход'); switch m case 1 figure(1); X0=interval(1):interval(3):interval(2); Y0=X0.^4/1000-263*X0.^3/3000+53*X0.^2/200 | 64*X0; [X1,Y1]=meiler(interval,polynom,starts); [X2,Y2] = RungeKutta(h,polynom); plot(X0,Y0,'black',X1,Y1,'b',X2,Y2,'r'); grid on case 2 [X,Y]=meiler(interval,polynom,starts); method_name='Метод Эйлера'; write_results(interval,polynom,X,Y,method_name,true); case 3 [X,Y]= RungeKutta(h,polynom); method_name='Метод Рунге-Кутта'; write_results(interval,polynom,X,Y,method_name,true); case 4 write_results(interval,polynom,X,Y,method_name,false,h); case 5 disp('Завершение работы программы.'); break; end end Код файла write_results.m: function write_results(interval,polynom,X,Y,method_name,into_console,h) header='1'; conditions=' a | b | c | d | h'; header2='2'; y_0=0; x_0=0; starts=[x_0,y_0]; if into_console fprintf('%s\n',header); fprintf('%s | %s\n', conditions, method_name); polynom(1), polynom(2), polynom(3), polynom(4), interval(3); fprintf('%s\n',header2); for i=1:1:numel(X)-1 fprintf(' %2d | %-10.3f | %-10.3f\n',i,X(i),Y(i)) end else filename='results22.txt'; file=fopen(filename,'w'); X0=interval(1) : interval(3) : interval(2); Y0= X0.^4/1000-263*X0.^3/3000+53*X0.^2/200+64*X0; [~,Y1]=meiler(interval,polynom,starts); [~,Y2]= RungeKutta(h,polynom); for i=1:1:numel(X0)-1 fprintf(file, '%i %10.3f %10.3f %10.3f %10.3f\r\n', i,X0(i),Y0(i),Y1(i),Y2(i)); end fclose(file); end end Код файла meiler.m: function [X,Y]=meiler(interval,polynom,starts) h=interval(3); n=1+(interval(2)-interval(1))/h; X=zeros(1,n); Y=zeros(1,n); X(1)=starts(1); Y(1)=starts(2); for i=1:1:n-1 Y(i+1)=Y(i)+h*myfunc(polynom,X(i)); X(i+1)=X(i)+h; end end Код файла RungeKutta: function [X,Y] = RungeKutta(h,POLY) x=0; y=0; while (x(end)<=30) ugolkas=polyval(POLY,x(end)); y2=y(end)+h*ugolkas; x(end+1)=x(end)+h; ugolkas2=polyval(POLY,x(end)); y(end+1)=y(end)+h*(ugolkas+ugolkas2)/2; end X=x; Y=y; end Код файла myfunc.m: function value = myfunc(polynom,x) value=polyval(polynom,x); end Рисунок 1 – Меню Рисунок 2 – График Результат при выборе “Метод Эйлера”: 1 a| b| c| d| h | Метод Эйлера ans = 0.0040 ans = -0.2630 ans = 0.5300 ans = 64 2 1 | 0.000 | 0.000 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 0.100 | 0.200 | 0.300 | 0.400 | 0.500 | 0.600 | 0.700 | 0.800 | 0.900 | 1.000 | 1.100 | 1.200 | 1.300 | 1.400 | 1.500 | 1.600 | 1.700 | 1.800 | 1.900 | 2.000 | 2.100 | 2.200 | 2.300 | 2.400 | 2.500 | 2.600 | 2.700 | 2.800 | 2.900 | 3.000 | 3.100 | 3.200 | 3.300 | 3.400 | 3.500 | 3.600 | 3.700 | 3.800 | 3.900 | 4.000 | 4.100 | 4.200 | 4.300 | 4.400 | 4.500 | | | | | | | | 6.400 12.805 19.215 25.628 32.045 38.465 44.888 51.312 | 57.738 | 64.164 | 70.591 | 77.018 | 83.445 | 89.870 | 96.294 | 102.716 | 109.135 | 115.551 | 121.963 | 128.372 | 134.776 | 141.175 | 147.568 | 153.956 | 160.337 | 166.712 | 173.079 | 179.438 | 185.789 | 192.131 | 198.464 | 204.788 | 211.101 | 217.404 | 223.696 | 229.976 | 236.245 | 242.501 | 248.745 | 254.975 | 261.192 | 267.395 | 273.583 | 279.757 | 285.915 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 4.600 | 4.700 | 4.800 | 4.900 | 5.000 | 5.100 | 5.200 | 5.300 | 5.400 | 5.500 | 5.600 | 5.700 | 5.800 | 5.900 | 6.000 | 6.100 | 6.200 | 6.300 | 6.400 | 6.500 | 6.600 | 6.700 | 6.800 | 6.900 | 7.000 | 7.100 | 7.200 | 7.300 | 7.400 | 7.500 | 7.600 | 7.700 | 7.800 | 7.900 | 8.000 | 8.100 | 8.200 | 8.300 | 8.400 | 8.500 | 8.600 | 8.700 | 8.800 | 8.900 | 9.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 292.057 298.183 304.293 310.386 316.461 322.518 328.558 334.578 340.580 346.562 352.525 358.467 364.389 370.290 376.169 382.027 387.862 393.675 399.465 405.232 410.975 416.694 422.389 428.059 433.704 439.324 444.917 450.485 456.026 461.540 467.027 472.486 477.917 483.320 488.695 494.041 499.357 504.644 509.900 515.127 520.323 525.488 530.622 535.724 540.795 92 | 9.100 93 | 9.200 94 | 9.300 95 | 9.400 96 | 9.500 97 | 9.600 98 | 9.700 99 | 9.800 100 | 9.900 101 | 10.000 102 | 10.100 103 | 10.200 104 | 10.300 105 | 10.400 106 | 10.500 107 | 10.600 108 | 10.700 109 | 10.800 110 | 10.900 111 | 11.000 112 | 11.100 113 | 11.200 114 | 11.300 115 | 11.400 116 | 11.500 117 | 11.600 118 | 11.700 119 | 11.800 120 | 11.900 121 | 12.000 122 | 12.100 123 | 12.200 124 | 12.300 125 | 12.400 126 | 12.500 127 | 12.600 128 | 12.700 129 | 12.800 130 | 12.900 131 | 13.000 132 | 13.100 133 | 13.200 134 | 13.300 135 | 13.400 136 | 13.500 | | | | | | | | 545.833 550.839 555.812 560.752 565.658 570.531 575.370 580.175 | 584.945 | 589.680 | 594.380 | 599.045 | 603.673 | 608.266 | 612.823 | 617.343 | 621.826 | 626.272 | 630.680 | 635.052 | 639.385 | 643.680 | 647.936 | 652.154 | 656.333 | 660.472 | 664.573 | 668.633 | 672.654 | 676.634 | 680.574 | 684.474 | 688.332 | 692.149 | 695.925 | 699.660 | 703.352 | 707.003 | 710.611 | 714.177 | 717.700 | 721.180 | 724.617 | 728.011 | 731.361 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | 13.600 | 13.700 | 13.800 | 13.900 | 14.000 | 14.100 | 14.200 | 14.300 | 14.400 | 14.500 | 14.600 | 14.700 | 14.800 | 14.900 | 15.000 | 15.100 | 15.200 | 15.300 | 15.400 | 15.500 | 15.600 | 15.700 | 15.800 | 15.900 | 16.000 | 16.100 | 16.200 | 16.300 | 16.400 | 16.500 | 16.600 | 16.700 | 16.800 | 16.900 | 17.000 | 17.100 | 17.200 | 17.300 | 17.400 | 17.500 | 17.600 | 17.700 | 17.800 | 17.900 | 18.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 734.668 737.930 741.149 744.323 747.452 750.537 753.577 756.572 759.521 762.425 765.283 768.096 770.863 773.583 776.257 778.884 781.465 783.999 786.486 788.926 791.318 793.663 795.961 798.210 800.412 802.566 804.671 806.728 808.737 810.697 812.608 814.470 816.283 818.047 819.762 821.428 823.044 824.610 826.127 827.594 829.011 830.377 831.694 832.960 834.177 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | 18.100 | 18.200 | 18.300 | 18.400 | 18.500 | 18.600 | 18.700 | 18.800 | 18.900 | 19.000 | 19.100 | 19.200 | 19.300 | 19.400 | 19.500 | 19.600 | 19.700 | 19.800 | 19.900 | 20.000 | 20.100 | 20.200 | 20.300 | 20.400 | 20.500 | 20.600 | 20.700 | 20.800 | 20.900 | 21.000 | 21.100 | 21.200 | 21.300 | 21.400 | 21.500 | 21.600 | 21.700 | 21.800 | 21.900 | 22.000 | 22.100 | 22.200 | 22.300 | 22.400 | 22.500 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 835.342 836.457 837.522 838.535 839.498 840.410 841.271 842.081 842.840 843.547 844.204 844.809 845.362 845.864 846.315 846.714 847.061 847.356 847.600 847.792 847.932 848.020 848.056 848.040 847.972 847.852 847.680 847.456 847.179 846.851 846.470 846.037 845.551 845.013 844.423 843.781 843.086 842.340 841.540 840.689 839.785 838.828 837.820 836.759 835.645 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 | 22.600 | 22.700 | 22.800 | 22.900 | 23.000 | 23.100 | 23.200 | 23.300 | 23.400 | 23.500 | 23.600 | 23.700 | 23.800 | 23.900 | 24.000 | 24.100 | 24.200 | 24.300 | 24.400 | 24.500 | 24.600 | 24.700 | 24.800 | 24.900 | 25.000 | 25.100 | 25.200 | 25.300 | 25.400 | 25.500 | 25.600 | 25.700 | 25.800 | 25.900 | 26.000 | 26.100 | 26.200 | 26.300 | 26.400 | 26.500 | 26.600 | 26.700 | 26.800 | 26.900 | 27.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 834.480 833.262 831.991 830.669 829.294 827.867 826.388 824.857 823.274 821.638 819.951 818.211 816.420 814.576 812.681 810.734 808.735 806.684 804.581 802.427 800.222 797.965 795.656 793.296 790.885 788.422 785.909 783.344 780.728 778.062 775.344 772.576 769.757 766.887 763.967 760.997 757.976 754.905 751.784 748.613 745.393 742.122 738.802 735.432 732.013 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | 27.100 | 27.200 | 27.300 | 27.400 | 27.500 | 27.600 | 27.700 | 27.800 | 27.900 | 28.000 | 28.100 | 28.200 | 28.300 | 28.400 | 28.500 | 28.600 | 28.700 | 28.800 | 28.900 | 29.000 | 29.100 | 29.200 | 29.300 | 29.400 | 29.500 | 29.600 | 29.700 | 29.800 | 29.900 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 728.544 725.027 721.460 717.844 714.180 710.467 706.705 702.895 699.037 695.130 691.176 687.173 683.124 679.026 674.881 670.689 666.450 662.164 657.832 653.452 649.027 644.555 640.037 635.473 630.863 626.208 621.508 616.762 611.971 Результат при выборе “Метод Рунге-Кутта”: 1 a| b| c| d| h ans = 0.0040 ans = -0.2630 ans = | Метод Рунге-Кутта 0.5300 ans = 64 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 0.000 | 0.100 | 0.200 | 0.300 | 0.400 | 0.500 | 0.600 | 0.700 | 0.800 | 0.900 | 1.000 | 1.100 | 1.200 | 1.300 | 1.400 | 1.500 | 1.600 | 1.700 | 1.800 | 1.900 | 2.000 | 2.100 | 2.200 | 2.300 | 2.400 | 2.500 | 2.600 | 2.700 | 2.800 | 2.900 | 3.000 | 3.100 | 3.200 | 3.300 | 3.400 | 3.500 | | | | | | | | | 0.000 6.403 12.810 19.221 25.637 32.055 38.476 44.900 51.325 | 57.751 | 64.178 | 70.605 | 77.032 | 83.458 | 89.882 | 96.305 | 102.725 | 109.143 | 115.557 | 121.968 | 128.374 | 134.775 | 141.172 | 147.562 | 153.947 | 160.324 | 166.695 | 173.058 | 179.413 | 185.760 | 192.098 | 198.426 | 204.744 | 211.053 | 217.350 | 223.636 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 3.600 | 3.700 | 3.800 | 3.900 | 4.000 | 4.100 | 4.200 | 4.300 | 4.400 | 4.500 | 4.600 | 4.700 | 4.800 | 4.900 | 5.000 | 5.100 | 5.200 | 5.300 | 5.400 | 5.500 | 5.600 | 5.700 | 5.800 | 5.900 | 6.000 | 6.100 | 6.200 | 6.300 | 6.400 | 6.500 | 6.600 | 6.700 | 6.800 | 6.900 | 7.000 | 7.100 | 7.200 | 7.300 | 7.400 | 7.500 | 7.600 | 7.700 | 7.800 | 7.900 | 8.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 229.911 236.173 242.423 248.660 254.884 261.094 267.289 273.470 279.636 285.786 291.920 298.038 304.139 310.223 316.290 322.338 328.368 334.379 340.371 346.344 352.296 358.228 364.139 370.029 375.898 381.744 387.568 393.370 399.148 404.903 410.635 416.342 422.024 427.682 433.314 438.920 444.501 450.055 455.583 461.083 466.556 472.002 477.419 482.808 488.168 82 | 8.100 83 | 8.200 84 | 8.300 85 | 8.400 86 | 8.500 87 | 8.600 88 | 8.700 89 | 8.800 90 | 8.900 91 | 9.000 92 | 9.100 93 | 9.200 94 | 9.300 95 | 9.400 96 | 9.500 97 | 9.600 98 | 9.700 99 | 9.800 100 | 9.900 101 | 10.000 102 | 10.100 103 | 10.200 104 | 10.300 105 | 10.400 106 | 10.500 107 | 10.600 108 | 10.700 109 | 10.800 110 | 10.900 111 | 11.000 112 | 11.100 113 | 11.200 114 | 11.300 115 | 11.400 116 | 11.500 117 | 11.600 118 | 11.700 119 | 11.800 120 | 11.900 121 | 12.000 122 | 12.100 123 | 12.200 124 | 12.300 125 | 12.400 126 | 12.500 | | | | | | | | | | | | | | | | | | 493.499 498.800 504.072 509.314 514.525 519.706 524.855 529.973 535.059 540.114 545.136 550.125 555.082 560.005 564.895 569.751 574.572 579.360 | 584.112 | 588.830 | 593.512 | 598.159 | 602.770 | 607.344 | 611.883 | 616.384 | 620.849 | 625.276 | 629.666 | 634.018 | 638.332 | 642.608 | 646.845 | 651.043 | 655.203 | 659.323 | 663.403 | 667.443 | 671.444 | 675.404 | 679.324 | 683.203 | 687.041 | 690.837 | 694.592 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | 12.600 | 12.700 | 12.800 | 12.900 | 13.000 | 13.100 | 13.200 | 13.300 | 13.400 | 13.500 | 13.600 | 13.700 | 13.800 | 13.900 | 14.000 | 14.100 | 14.200 | 14.300 | 14.400 | 14.500 | 14.600 | 14.700 | 14.800 | 14.900 | 15.000 | 15.100 | 15.200 | 15.300 | 15.400 | 15.500 | 15.600 | 15.700 | 15.800 | 15.900 | 16.000 | 16.100 | 16.200 | 16.300 | 16.400 | 16.500 | 16.600 | 16.700 | 16.800 | 16.900 | 17.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 698.306 701.977 705.607 709.194 712.738 716.240 719.699 723.114 726.486 729.814 733.099 736.339 739.536 742.687 745.794 748.857 751.874 754.846 757.773 760.654 763.490 766.279 769.023 771.720 774.371 776.975 779.532 782.043 784.506 786.922 789.291 791.612 793.886 796.111 798.289 800.418 802.500 804.532 806.517 808.452 810.339 812.177 813.965 815.705 817.395 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | 17.100 | 17.200 | 17.300 | 17.400 | 17.500 | 17.600 | 17.700 | 17.800 | 17.900 | 18.000 | 18.100 | 18.200 | 18.300 | 18.400 | 18.500 | 18.600 | 18.700 | 18.800 | 18.900 | 19.000 | 19.100 | 19.200 | 19.300 | 19.400 | 19.500 | 19.600 | 19.700 | 19.800 | 19.900 | 20.000 | 20.100 | 20.200 | 20.300 | 20.400 | 20.500 | 20.600 | 20.700 | 20.800 | 20.900 | 21.000 | 21.100 | 21.200 | 21.300 | 21.400 | 21.500 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 819.036 820.627 822.169 823.660 825.102 826.494 827.836 829.127 830.369 831.559 832.700 833.789 834.828 835.817 836.754 837.641 838.476 839.260 839.994 840.676 841.306 841.885 842.413 842.890 843.314 843.687 844.009 844.278 844.496 844.662 844.776 844.838 844.848 844.806 844.712 844.566 844.368 844.118 843.815 843.460 843.053 842.594 842.082 841.518 840.902 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 | 21.600 | 21.700 | 21.800 | 21.900 | 22.000 | 22.100 | 22.200 | 22.300 | 22.400 | 22.500 | 22.600 | 22.700 | 22.800 | 22.900 | 23.000 | 23.100 | 23.200 | 23.300 | 23.400 | 23.500 | 23.600 | 23.700 | 23.800 | 23.900 | 24.000 | 24.100 | 24.200 | 24.300 | 24.400 | 24.500 | 24.600 | 24.700 | 24.800 | 24.900 | 25.000 | 25.100 | 25.200 | 25.300 | 25.400 | 25.500 | 25.600 | 25.700 | 25.800 | 25.900 | 26.000 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 840.234 839.513 838.740 837.914 837.037 836.106 835.124 834.089 833.002 831.862 830.671 829.427 828.130 826.782 825.381 823.928 822.423 820.865 819.256 817.594 815.881 814.115 812.298 810.429 808.507 806.534 804.509 802.433 800.304 798.125 795.893 793.610 791.276 788.891 786.454 783.966 781.426 778.836 776.195 773.503 770.760 767.966 765.122 762.227 759.282 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | 26.100 | 26.200 | 26.300 | 26.400 | 26.500 | 26.600 | 26.700 | 26.800 | 26.900 | 27.000 | 27.100 | 27.200 | 27.300 | 27.400 | 27.500 | 27.600 | 27.700 | 27.800 | 27.900 | 28.000 | 28.100 | 28.200 | 28.300 | 28.400 | 28.500 | 28.600 | 28.700 | 28.800 | 28.900 | 29.000 | 29.100 | 29.200 | 29.300 | 29.400 | 29.500 | 29.600 | 29.700 | 29.800 | 29.900 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 756.286 753.241 750.145 746.999 743.803 740.557 737.262 733.917 730.522 727.078 723.585 720.043 716.452 712.812 709.123 705.386 701.600 697.766 693.883 689.953 685.975 681.949 677.875 673.754 669.585 665.370 661.107 656.798 652.442 648.039 643.591 639.096 634.555 629.968 625.336 620.658 615.935 611.167 606.354 Вывод: в данной лабораторной работе был изучен метод Эйлера, метод Рунге-Кутта.