fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. double *dvector(long i, long j);
  6. void free_dvector(double *a);
  7. void FUNC(double x, double *y, double *f);
  8. void rk4m(double *y, double *f, int N, double a, double b, double step, void (*F)(double, double *, double *));
  9.  
  10. int main(void) {
  11. int N = 2;
  12. double *y, *f, a = 0.0, b = 1.0, step = 0.01;
  13.  
  14. y = dvector(0, N - 1);
  15. f = dvector(0, N - 1);
  16.  
  17. y[0] = 0.1;
  18. y[1] = 0.0;
  19.  
  20. printf("x\ty\n"); // ヘッダーを出力
  21. rk4m(y, f, N, a, b, step, FUNC); // ファイル操作をせず標準出力
  22.  
  23. free_dvector(y);
  24. free_dvector(f);
  25.  
  26. return 0;
  27. }
  28.  
  29. void FUNC(double x, double *y, double *f) {
  30. f[0] = y[1]; // dy1/dx = y2
  31. f[1] = cos(x) - 4 * y[1] - 3 * y[0]; // dy2/dx = cos(x) - 4y2 - 3y1
  32. }
  33.  
  34. void rk4m(double *y, double *f, int N, double a, double b, double step, void (*F)(double, double *, double *)) {
  35. double *k1, *k2, *k3, *k4, *tmp, x, h;
  36. int j;
  37.  
  38. k1 = dvector(0, N - 1);
  39. k2 = dvector(0, N - 1);
  40. k3 = dvector(0, N - 1);
  41. k4 = dvector(0, N - 1);
  42. tmp = dvector(0, N - 1);
  43.  
  44. h = step;
  45. x = a;
  46.  
  47. while (x <= b) {
  48. printf("%.2lf\t%.10lf\n", x, y[0]); // x と y[0] を標準出力
  49.  
  50. F(x, y, f);
  51. for (j = 0; j < N; j++) k1[j] = f[j];
  52.  
  53. for (j = 0; j < N; j++) tmp[j] = y[j] + h * k1[j] / 2.0;
  54. F(x + h / 2.0, tmp, f);
  55. for (j = 0; j < N; j++) k2[j] = f[j];
  56.  
  57. for (j = 0; j < N; j++) tmp[j] = y[j] + h * k2[j] / 2.0;
  58. F(x + h / 2.0, tmp, f);
  59. for (j = 0; j < N; j++) k3[j] = f[j];
  60.  
  61. for (j = 0; j < N; j++) tmp[j] = y[j] + h * k3[j];
  62. F(x + h, tmp, f);
  63. for (j = 0; j < N; j++) k4[j] = f[j];
  64.  
  65. for (j = 0; j < N; j++)
  66. y[j] = y[j] + h * (k1[j] + 2 * k2[j] + 2 * k3[j] + k4[j]) / 6.0;
  67.  
  68. x += h; // x を更新
  69. }
  70.  
  71. free_dvector(k1);
  72. free_dvector(k2);
  73. free_dvector(k3);
  74. free_dvector(k4);
  75. free_dvector(tmp);
  76. }
  77.  
  78. double *dvector(long i, long j) {
  79. double *a;
  80. if ((a = malloc((j - i + 1) * sizeof(double))) == NULL) {
  81. printf("メモリが確保できません\n");
  82. exit(1);
  83. }
  84. return a;
  85. }
  86.  
  87. void free_dvector(double *a) {
  88. free(a);
  89. }
  90.  
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
x	y
0.00	0.1000000000
0.01	0.1000345367
0.02	0.1001363201
0.03	0.1003026687
0.04	0.1005309773
0.05	0.1008187152
0.06	0.1011634232
0.07	0.1015627122
0.08	0.1020142611
0.09	0.1025158142
0.10	0.1030651803
0.11	0.1036602300
0.12	0.1042988942
0.13	0.1049791625
0.14	0.1056990812
0.15	0.1064567521
0.16	0.1072503302
0.17	0.1080780230
0.18	0.1089380883
0.19	0.1098288333
0.20	0.1107486125
0.21	0.1116958272
0.22	0.1126689235
0.23	0.1136663912
0.24	0.1146867626
0.25	0.1157286113
0.26	0.1167905511
0.27	0.1178712345
0.28	0.1189693521
0.29	0.1200836311
0.30	0.1212128345
0.31	0.1223557600
0.32	0.1235112392
0.33	0.1246781361
0.34	0.1258553471
0.35	0.1270417991
0.36	0.1282364493
0.37	0.1294382843
0.38	0.1306463190
0.39	0.1318595960
0.40	0.1330771848
0.41	0.1342981810
0.42	0.1355217057
0.43	0.1367469046
0.44	0.1379729478
0.45	0.1391990283
0.46	0.1404243622
0.47	0.1416481877
0.48	0.1428697644
0.49	0.1440883729
0.50	0.1453033143
0.51	0.1465139093
0.52	0.1477194982
0.53	0.1489194398
0.54	0.1501131115
0.55	0.1512999081
0.56	0.1524792422
0.57	0.1536505430
0.58	0.1548132561
0.59	0.1559668432
0.60	0.1571107817
0.61	0.1582445640
0.62	0.1593676974
0.63	0.1604797035
0.64	0.1615801182
0.65	0.1626684908
0.66	0.1637443841
0.67	0.1648073740
0.68	0.1658570488
0.69	0.1668930095
0.70	0.1679148689
0.71	0.1689222517
0.72	0.1699147941
0.73	0.1708921434
0.74	0.1718539578
0.75	0.1727999063
0.76	0.1737296683
0.77	0.1746429333
0.78	0.1755394006
0.79	0.1764187794
0.80	0.1772807883
0.81	0.1781251551
0.82	0.1789516166
0.83	0.1797599185
0.84	0.1805498152
0.85	0.1813210693
0.86	0.1820734518
0.87	0.1828067418
0.88	0.1835207262
0.89	0.1842151996
0.90	0.1848899643
0.91	0.1855448297
0.92	0.1861796126
0.93	0.1867941370
0.94	0.1873882335
0.95	0.1879617399
0.96	0.1885145002
0.97	0.1890463652
0.98	0.1895571920
0.99	0.1900468439