Puede resolver esto con un programa exactamente de la misma manera que lo resuelve a mano (con multiplicación y sustracción, y luego devolviendo los resultados a las ecuaciones). Esto es bastante estándar en matemáticas de nivel secundario.
-44.3940 = 50a + 37b + c (A)
-45.3049 = 43a + 39b + c (B)
-44.9594 = 52a + 41b + c (C)
(A-B): 0.9109 = 7a - 2b (D)
(B-C): 0.3455 = -9a - 2b (E)
(D-E): 1.2564 = 16a (F)
(F/16): a = 0.078525 (G)
Feed G into D:
0.9109 = 7a - 2b
=> 0.9109 = 0.549675 - 2b (substitute a)
=> 0.361225 = -2b (subtract 0.549675 from both sides)
=> -0.1806125 = b (divide both sides by -2) (H)
Feed H/G into A:
-44.3940 = 50a + 37b + c
=> -44.3940 = 3.92625 - 6.6826625 + c (substitute a/b)
=> -41.6375875 = c (subtract 3.92625 - 6.6826625 from both sides)
por lo que terminan con:
a = 0.0785250
b = -0.1806125
c = -41.6375875
Si conecta estos valores de nuevo en A, B y C, se encontrará que son correctos.
El truco es usar una matriz 4x3 simple que a su vez se reduce a una matriz de 3x2, luego un 2x1 que es "a = n", siendo n un número real. Una vez que tienes eso, lo pasas a la siguiente matriz para obtener otro valor, luego esos dos valores en la siguiente matriz hasta que hayas resuelto todas las variables.
Siempre que tenga N ecuaciones distintas, siempre puede resolver para N variables. Digo distinta porque estos dos no son:
7a + 2b = 50
14a + 4b = 100
Ellos son la ecuación misma multiplicado por dos, así que no se puede obtener una solución de ellos - la multiplicación de la primera por dos y luego restando te deja con la afirmación verdadera, pero inútil :
0 = 0 + 0
a modo de ejemplo, aquí hay algo de código C que se resuelve el sistema de ecuaciones que está colocado en su pregunta.Primeros algunos tipos necesarios, variables, una función de soporte para la impresión de una ecuación, y el inicio de main
:
#include <stdio.h>
typedef struct { double r, a, b, c; } tEquation;
tEquation equ1[] = {
{ -44.3940, 50, 37, 1 }, // -44.3940 = 50a + 37b + c (A)
{ -45.3049, 43, 39, 1 }, // -45.3049 = 43a + 39b + c (B)
{ -44.9594, 52, 41, 1 }, // -44.9594 = 52a + 41b + c (C)
};
tEquation equ2[2], equ3[1];
static void dumpEqu (char *desc, tEquation *e, char *post) {
printf ("%10s: %12.8lf = %12.8lfa + %12.8lfb + %12.8lfc (%s)\n",
desc, e->r, e->a, e->b, e->c, post);
}
int main (void) {
double a, b, c;
A continuación, la reducción de las tres ecuaciones con tres incógnitas a dos ecuaciones con dos incógnitas:
// First step, populate equ2 based on removing c from equ.
dumpEqu (">", &(equ1[0]), "A");
dumpEqu (">", &(equ1[1]), "B");
dumpEqu (">", &(equ1[2]), "C");
puts ("");
// A - B
equ2[0].r = equ1[0].r * equ1[1].c - equ1[1].r * equ1[0].c;
equ2[0].a = equ1[0].a * equ1[1].c - equ1[1].a * equ1[0].c;
equ2[0].b = equ1[0].b * equ1[1].c - equ1[1].b * equ1[0].c;
equ2[0].c = 0;
// B - C
equ2[1].r = equ1[1].r * equ1[2].c - equ1[2].r * equ1[1].c;
equ2[1].a = equ1[1].a * equ1[2].c - equ1[2].a * equ1[1].c;
equ2[1].b = equ1[1].b * equ1[2].c - equ1[2].b * equ1[1].c;
equ2[1].c = 0;
dumpEqu ("A-B", &(equ2[0]), "D");
dumpEqu ("B-C", &(equ2[1]), "E");
puts ("");
a continuación, la reducción de las dos ecuaciones con dos incógnitas a una ecuación con una incógnita:
// Next step, populate equ3 based on removing b from equ2.
// D - E
equ3[0].r = equ2[0].r * equ2[1].b - equ2[1].r * equ2[0].b;
equ3[0].a = equ2[0].a * equ2[1].b - equ2[1].a * equ2[0].b;
equ3[0].b = 0;
equ3[0].c = 0;
dumpEqu ("D-E", &(equ3[0]), "F");
puts ("");
Ahora que tenemos una fórmula de el tipo number1 = unknown * number2
, simplemente podemos calcular el valor desconocido con unknown <- number1/number2
. Luego, una vez que hayas calculado ese valor, sustitúyelo en una de las ecuaciones con dos incógnitas y resuelve el segundo valor. A continuación, sustituir esas dos incógnitas (ahora conocidos) en una de las ecuaciones originales y ahora tiene los valores para las tres incógnitas:
// Finally, substitute values back into equations.
a = equ3[0].r/equ3[0].a;
printf ("From (F ), a = %12.8lf (G)\n", a);
b = (equ2[0].r - equ2[0].a * a)/equ2[0].b;
printf ("From (D,G ), b = %12.8lf (H)\n", b);
c = (equ1[0].r - equ1[0].a * a - equ1[0].b * b)/equ1[0].c;
printf ("From (A,G,H), c = %12.8lf (I)\n", c);
return 0;
}
La salida de ese código coincide con los cálculos anteriores en esta respuesta:
>: -44.39400000 = 50.00000000a + 37.00000000b + 1.00000000c (A)
>: -45.30490000 = 43.00000000a + 39.00000000b + 1.00000000c (B)
>: -44.95940000 = 52.00000000a + 41.00000000b + 1.00000000c (C)
A-B: 0.91090000 = 7.00000000a + -2.00000000b + 0.00000000c (D)
B-C: -0.34550000 = -9.00000000a + -2.00000000b + 0.00000000c (E)
D-E: -2.51280000 = -32.00000000a + 0.00000000b + 0.00000000c (F)
From (F ), a = 0.07852500 (G)
From (D,G ), b = -0.18061250 (H)
From (A,G,H), c = -41.63758750 (I)
Otras personas han respondido a esta, pero echa un vistazo al libro * Análisis Numérico: Matemáticas de la Computación Científica * por Kincaid y Cheney. El libro trata principalmente de resolver diferentes sistemas de ecuaciones. – Matthew