fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define EPSILON 1e-6
  6. #define MAX_ITER 100
  7.  
  8. double f1(double x, double y) {
  9. return x * x + y * y - 4;
  10. }
  11.  
  12. double f2(double x, double y) {
  13. return x * x * x * x + x - y*y + 1;
  14. }
  15.  
  16. double df1_dx(double x, double y) { return 2 * x; }
  17. double df1_dy(double x, double y) { return 2 * y; }
  18. double df2_dx(double x, double y) { return 4 * x * x * x + 1; }
  19. double df2_dy(double x, double y) { return -2 * y; }
  20.  
  21. int main() {
  22. double x = 1, y = 3;
  23. int iter = 0;
  24.  
  25. printf("Initial guess: x = %.5f, y = %.5f\n", x, y);
  26.  
  27. while (iter < MAX_ITER) {
  28.  
  29. double F1 = f1(x, y);
  30. double F2 = f2(x, y);
  31.  
  32. if (fabs(F1) < EPSILON && fabs(F2) < EPSILON) {
  33. printf("Converged after %d iterations.\n", iter);
  34. printf("Solution: x = %.5f, y = %.5f\n", x, y);
  35. return 0;
  36. }
  37.  
  38. double J11 = df1_dx(x, y);
  39. double J12 = df1_dy(x, y);
  40. double J21 = df2_dx(x, y);
  41. double J22 = df2_dy(x, y);
  42.  
  43. double det = J11 * J22 - J12 * J21;
  44. if (fabs(det) < 1e-12) {
  45. printf("Jacobian determinant too small. Method fails.\n");
  46. return 1;
  47. }
  48.  
  49. double dx = (-F1 * J22 + F2 * J12) / det;
  50. double dy = (-J11 * F2 + J21 * F1) / det;
  51.  
  52.  
  53. printf("iter %2d: x=%.10f y=%.10f f1=%.10f f2=%.10f dx=%.10f dy=%.10f x_next=%.10f y_next=%.10f\n",
  54. iter, x, y, F1, F2, dx, dy, x + dx, y + dy);
  55.  
  56.  
  57. x += dx;
  58. y += dy;
  59. iter++;
  60. }
  61.  
  62. printf("Did not converge within %d iterations.\n", MAX_ITER);
  63. return 1;
  64. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
Initial guess: x = 1.00000, y = 3.00000
iter  0: x=1.0000000000  y=3.0000000000  f1=6.0000000000  f2=-6.0000000000  dx=-0.0000000000  dy=-1.0000000000  x_next=1.0000000000  y_next=2.0000000000
iter  1: x=1.0000000000  y=2.0000000000  f1=1.0000000000  f2=-1.0000000000  dx=-0.0000000000  dy=-0.2500000000  x_next=1.0000000000  y_next=1.7500000000
iter  2: x=1.0000000000  y=1.7500000000  f1=0.0625000000  f2=-0.0625000000  dx=-0.0000000000  dy=-0.0178571429  x_next=1.0000000000  y_next=1.7321428571
iter  3: x=1.0000000000  y=1.7321428571  f1=0.0003188776  f2=-0.0003188776  dx=0.0000000000  dy=-0.0000920471  x_next=1.0000000000  y_next=1.7320508100
Converged after 4 iterations.
Solution: x = 1.00000, y = 1.73205