fork(2) download
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. using namespace std;
  5.  
  6. double x[12000] = {0}, y[12000] = {0}, z[12000] = {0};
  7.  
  8. double f(double x, double y, double z)
  9. {
  10. return 6*x;//2*z-y+x-2;
  11. }
  12.  
  13. double Y(double x)
  14. {
  15. double C1 = 1, C2 = 1;
  16. return pow(x, 3) + C1*x + C2;//C1*exp(x)+C2*x*exp(x)+x;
  17. }
  18.  
  19. double L(int n)
  20. {
  21. double s = 0;
  22. for (int i = 0; i < n; i++)
  23. {
  24. s += sqrt(pow(x[i]-x[i+1], 2) + pow(y[i]-y[i+1], 2));
  25. }
  26. return s;
  27. }
  28.  
  29. void d2(double x0, double y0, double z0, double b, int n)
  30. {
  31. double tau = ((b-x0)+.0)/(n+.0);
  32. x[0] = x0; y[0] = y0; z[0] = z0;
  33. double k1, k2, k3, k4;
  34. double m1, m2, m3, m4;
  35. //cout << "\tn = " << n << "\ntau = " << tau << endl;
  36. for (int i = 0; i <= n; i++)
  37. {
  38. x[i] = x0 + i*tau;
  39. //cout << "x_i = " << x0+i*tau << endl;
  40. m1 = z[i];
  41. k1 = f(x[i], y[i], z[i]);
  42. m2 = z[i]+tau*k1/2.;
  43. k2 = f(x[i] + tau/2., y[i] + tau*m1/2., z[i] + tau*k1/2.);
  44. m3 = z[i]+tau*k2/2.;
  45. k3 = f(x[i] + tau/2., y[i] + tau*m2/2., z[i] + tau*k2/2.);
  46. m4 = z[i]+tau*k3;
  47. k4 = f(x[i] + tau, y[i] + tau*m3, z[i] + tau*k3);
  48. y[i+1] = y[i] + tau * (m1 + 2.*m2 + 2.*m3 + m4)/6.;
  49. z[i+1] = z[i] + tau * (k1 + 2.*k2 + 2.*k3 + k4)/6.;
  50. }
  51. }
  52.  
  53. double f2(double x0, double y0, double beta, double b, int n)
  54. {
  55. d2(x0, y0, beta, b, n);
  56. return L(n);
  57. }
  58.  
  59. double gs(double x0, double y0, double b, int n)
  60. {
  61. double x11 = -100, x22 = 100, x1, x2;
  62. double md = (1 + sqrt(5)) / 2, eps = 1e-6;
  63. int i = 0;
  64. //std::cout << "i a b |a - b| \n";
  65. while (fabs(x11 - x22) >= eps)
  66. {
  67. x1 = x22 - (x22 - x11) / md;
  68. x2 = x11 + (x22 - x11) / md;
  69. if (f2(x0, y0, x1, b, n) >= f2(x0, y0, x2, b, n)) x11 = x1; else x22 = x2;
  70. //std::cout << "\n" << ++i << " " << x11 << " " << x22 << " " << fabs(x11 - x22) << "\n";
  71. }
  72. return (x11+x22)/2;
  73. }
  74.  
  75. int main() {
  76. double x0, y0, z0, b, n, eps = 1e-8;
  77. //cout << "n = ";
  78. cin >> n;
  79. //cout << "x0 = ";
  80. cin >> x0;
  81. //cout << "y0 = ";
  82. cin >> y0;
  83. //cout << "z0 = ";
  84. cin >> z0;
  85. //cout << "b = ";
  86. cin >> b;
  87. d2(x0, y0, z0, b, n);
  88. cout << "x_i \t y_i \t \t Y_i \t \t |Y_i - y_i|\n";
  89. for (int i = 0; i <= 10; i++)
  90. {
  91. cout << x[i*int(n/10)] << "\t\t " << y[i*int(n/10)]
  92. << " \t\t " << Y(x[i*int(n/10)])
  93. << " \t " << fabs(Y(x[i*int(n/10)]) - y[i*int(n/10)]) << endl;
  94. }
  95. double zL, zL_;
  96. zL_ = gs(x0, y0, b, n/2);
  97. zL = gs(x0, y0, b, n);
  98. while (fabs(zL-zL_) > eps)
  99. {
  100.  
  101. zL_ = zL;n*=2;
  102. zL = gs(x0, y0, b, n);
  103. d2(x0, y0, zL, b, n);
  104. //cout << "\n=\nn = " << n << "\nmin zL = " << zL << "\nmin zL_ = " << zL_
  105. //<< "\nmin L = " << L(n) << endl;
  106. printf("\n=\nn=%lf\nzL=%.20lf\nL=%.20lf\n", n, zL, L(n));
  107. }
  108.  
  109. return 0;
  110. }
Success #stdin #stdout 0.02s 4264KB
stdin
10
0 1 1
1
stdout
x_i 	 y_i 	 	 Y_i 	 	 |Y_i - y_i|
0		 1 		 1 	 0
0.1		 1.101 		 1.101 	 0
0.2		 1.208 		 1.208 	 0
0.3		 1.327 		 1.327 	 0
0.4		 1.464 		 1.464 	 0
0.5		 1.625 		 1.625 	 0
0.6		 1.816 		 1.816 	 2.22045e-16
0.7		 2.043 		 2.043 	 0
0.8		 2.312 		 2.312 	 0
0.9		 2.629 		 2.629 	 4.44089e-16
1		 3 		 3 	 4.44089e-16

=
n=20.000000
zL=-0.89991492927446214978
L=1.30796206640261125642

=
n=40.000000
zL=-0.89951172793750777679
L=1.30838538845277851941

=
n=80.000000
zL=-0.89941109452739476104
L=1.30849120341080604746

=
n=160.000000
zL=-0.89938571766834929377
L=1.30851765617616622173

=
n=320.000000
zL=-0.89937972700455914854
L=1.30852426930657306237

=
n=640.000000
zL=-0.89937831280067448425
L=1.30852592258538447112

=
n=1280.000000
zL=-0.89937777262285756308
L=1.30852633590483469206

=
n=2560.000000
zL=-0.89937743877460651909
L=1.30852643923468470177

=
n=5120.000000
zL=-0.89937743877460651909
L=1.30852646506714553887