Sie können dies mit einem Programm genau so lösen, wie Sie es von Hand lösen (mit Multiplikation und Subtraktion, dann führen Sie die Ergebnisse wieder in die Gleichungen ein). Dies ist eine ziemlich normale Mathematik auf Sekundarschulniveau.
-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)
So Sie am Ende mit:
a = 0.0785250
b = -0.1806125
c = -41.6375875
Wenn Sie diese Werte wieder in A, B und C stecken, finden Sie sie richtig sind.
Der Trick besteht darin, eine einfache 4x3-Matrix zu verwenden, die wiederum zu einer 3x2-Matrix reduziert wird, dann zu einer 2x1, die "a = n" ist, wobei n eine tatsächliche Zahl ist. Sobald Sie das haben, füttern Sie es in die nächste Matrix, um einen anderen Wert zu erhalten, dann diese zwei Werte in die nächste Matrix, bis Sie alle Variablen gelöst haben.
Vorausgesetzt, Sie haben N verschiedene Gleichungen, können Sie immer für N Variablen lösen. Ich sage anders, weil diese beide sind nicht:
7a + 2b = 50
14a + 4b = 100
Sie das mit zwei multipliziert gleichen Gleichung sind so können Sie keine Lösung von ihnen erhalten - Multiplikation der ersten von zwei dann Subtrahieren Blätter Sie mit der wahren, aber nutzlos Aussage :
0 = 0 + 0
Als Beispiel, hier einig C-Code, der die simultanen Gleichungen ausarbeitet, die Sie in Ihrer Frage gestellt sind.Zunächst einige notwendige Typen, Variablen, eine Stützfunktion für eine Gleichung auszudrucken, und der Beginn der 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;
Als nächstes wird die Reduktion der drei Gleichungen mit drei Unbekannten zu zwei Gleichungen mit zwei Unbekannten:
// 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 ("");
Als nächstes wird die Reduktion der beiden Gleichungen mit zwei unbekannten zu einer Gleichung mit einer unbekannten:
// 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 ("");
Jetzt, da wir eine Formel vom Typ number1 = unknown * number2
können wir den unbekannten Wert einfach mit unknown <- number1/number2
ausrechnen. Sobald Sie diesen Wert herausgefunden haben, ersetzen Sie ihn in eine der Gleichungen mit zwei Unbekannten und berechnen Sie den zweiten Wert. Dann ersetzen diese beiden (jetzt bekannt) Unbekannten in einer der ursprünglichen Gleichungen und Sie nun die Werte für alle drei Unbekannten haben:
// 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;
}
Der Ausgang dieses Codes entspricht den früheren Berechnungen in dieser Antwort:
>: -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)
Andere Leute diese beantwortet haben, aber das Buch * Numerische Analysis finden Sie unter: Mathematics of Scientific Computing * von Kincaid und Cheney. Im Buch geht es hauptsächlich darum, verschiedene Gleichungssysteme zu lösen. – Matthew