#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define EPSILON 1e-6 // Convergence tolerance
#define MAX_ITER 100 // Maximum iterations
// Define the nonlinear equations
double f1(double x, double y) {
return x * x + y * y - 4;
}
double f2(double x, double y) {
return x * x * x * x + x - y*y + 1; // Hyperbola: xy = 1
}
// Partial derivatives for Jacobian matrix
double df1_dx(double x, double y) { return 2 * x; }
double df1_dy(double x, double y) { return 2 * y; }
double df2_dx(double x, double y) { return 4 * x * x*x + 1; }
double df2_dy(double x, double y) { return -2* y; }
int main() {
double x = 1, y = 3; // Initial guess
int iter = 0;
printf("Initial guess: x = %.6f, y = %.6f\n", x
, y
);
while (iter < MAX_ITER) {
// Function values
double F1 = f1(x, y);
double F2 = f2(x, y);
// Check convergence
if (fabs(F1
) < EPSILON
&& fabs(F2
) < EPSILON
) { printf("Converged after %d iterations.\n", iter
); printf("Solution: x = %.6f, y = %.6f\n", x
, y
); return 0;
}
// Jacobian matrix
double J11 = df1_dx(x, y);
double J12 = df1_dy(x, y);
double J21 = df2_dx(x, y);
double J22 = df2_dy(x, y);
// Determinant of Jacobian
double det = J11 * J22 - J12 * J21;
printf("Jacobian determinant too small. Method fails.\n"); return 1;
}
// Inverse Jacobian * F
double dx = (-F1 * J22 + F2 * J12) / det;
double dy = (-J11 * F2 + J21 * F1) / det;
// Update variables
x += dx;
y += dy;
iter++;
}
printf("Did not converge within %d iterations.\n", MAX_ITER
); return 1;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgRVBTSUxPTiAxZS02ICAgLy8gQ29udmVyZ2VuY2UgdG9sZXJhbmNlCiNkZWZpbmUgTUFYX0lURVIgMTAwICAgLy8gTWF4aW11bSBpdGVyYXRpb25zCgovLyBEZWZpbmUgdGhlIG5vbmxpbmVhciBlcXVhdGlvbnMKZG91YmxlIGYxKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgcmV0dXJuIHggKiB4ICsgeSAqIHkgLSA0OyAKfQoKZG91YmxlIGYyKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgcmV0dXJuIHggKiB4ICogeCAqIHggKyB4IC0geSp5ICsgMTsgLy8gSHlwZXJib2xhOiB4eSA9IDEKfQoKLy8gUGFydGlhbCBkZXJpdmF0aXZlcyBmb3IgSmFjb2JpYW4gbWF0cml4CmRvdWJsZSBkZjFfZHgoZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiAyICogeDsgfQpkb3VibGUgZGYxX2R5KGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gMiAqIHk7IH0KZG91YmxlIGRmMl9keChkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIDQgKiB4ICogeCp4ICsgMTsgfQpkb3VibGUgZGYyX2R5KGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gLTIqIHk7IH0KCmludCBtYWluKCkgewogICAgZG91YmxlIHggPSAxLCB5ID0gMzsgLy8gSW5pdGlhbCBndWVzcwogICAgaW50IGl0ZXIgPSAwOwoKICAgIHByaW50ZigiSW5pdGlhbCBndWVzczogeCA9ICUuNmYsIHkgPSAlLjZmXG4iLCB4LCB5KTsKCiAgICB3aGlsZSAoaXRlciA8IE1BWF9JVEVSKSB7CiAgICAgICAgLy8gRnVuY3Rpb24gdmFsdWVzCiAgICAgICAgZG91YmxlIEYxID0gZjEoeCwgeSk7CiAgICAgICAgZG91YmxlIEYyID0gZjIoeCwgeSk7CgogICAgICAgIC8vIENoZWNrIGNvbnZlcmdlbmNlCiAgICAgICAgaWYgKGZhYnMoRjEpIDwgRVBTSUxPTiAmJiBmYWJzKEYyKSA8IEVQU0lMT04pIHsKICAgICAgICAgICAgcHJpbnRmKCJDb252ZXJnZWQgYWZ0ZXIgJWQgaXRlcmF0aW9ucy5cbiIsIGl0ZXIpOwogICAgICAgICAgICBwcmludGYoIlNvbHV0aW9uOiB4ID0gJS42ZiwgeSA9ICUuNmZcbiIsIHgsIHkpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIC8vIEphY29iaWFuIG1hdHJpeAogICAgICAgIGRvdWJsZSBKMTEgPSBkZjFfZHgoeCwgeSk7CiAgICAgICAgZG91YmxlIEoxMiA9IGRmMV9keSh4LCB5KTsKICAgICAgICBkb3VibGUgSjIxID0gZGYyX2R4KHgsIHkpOwogICAgICAgIGRvdWJsZSBKMjIgPSBkZjJfZHkoeCwgeSk7CgogICAgICAgIC8vIERldGVybWluYW50IG9mIEphY29iaWFuCiAgICAgICAgZG91YmxlIGRldCA9IEoxMSAqIEoyMiAtIEoxMiAqIEoyMTsKICAgICAgICBpZiAoZmFicyhkZXQpIDwgMWUtMTIpIHsKICAgICAgICAgICAgcHJpbnRmKCJKYWNvYmlhbiBkZXRlcm1pbmFudCB0b28gc21hbGwuIE1ldGhvZCBmYWlscy5cbiIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgIC8vIEludmVyc2UgSmFjb2JpYW4gKiBGCiAgICAgICAgZG91YmxlIGR4ID0gKC1GMSAqIEoyMiArIEYyICogSjEyKSAvIGRldDsKICAgICAgICBkb3VibGUgZHkgPSAoLUoxMSAqIEYyICsgSjIxICogRjEpIC8gZGV0OwoKICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGVzCiAgICAgICAgeCArPSBkeDsKICAgICAgICB5ICs9IGR5OwoKICAgICAgICBpdGVyKys7CiAgICB9CgogICAgcHJpbnRmKCJEaWQgbm90IGNvbnZlcmdlIHdpdGhpbiAlZCBpdGVyYXRpb25zLlxuIiwgTUFYX0lURVIpOwogICAgcmV0dXJuIDE7Cn0=