Możesz rozwiązać ten problem za pomocą programu dokładnie w ten sam sposób, w jaki rozwiązałeś go ręcznie (mnożenie i odejmowanie, a następnie podawanie wyników do równania). Jest to dość standardowa matematyka na poziomie szkoły średniej.
-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)
więc skończyć z:
a = 0.0785250
b = -0.1806125
c = -41.6375875
Jeśli podłączysz te wartości z powrotem do A, B i C, a przekonasz się, że są prawidłowe.
Sztuką jest użycie prostej macierzy 4x3, która z kolei zmniejsza z kolei do matrycy 3x2, a następnie 2x1, która jest "a = n", gdzie n jest liczbą rzeczywistą. Kiedy już to zrobisz, wprowadzasz go do następnej macierzy, aby uzyskać kolejną wartość, następnie te dwie wartości do następnej macierzy, aż rozwiążesz wszystkie zmienne.
Pod warunkiem, że masz N różnych równań, zawsze możesz rozwiązać N zmiennych. Mówię wyraźny, ponieważ te dwa nie są:
7a + 2b = 50
14a + 4b = 100
Są równanie samo pomnożyć przez dwa, więc nie można uzyskać rozwiązanie z nimi - mnożąc pierwsze dwa potem odejmowanie pozostawia nam z prawdziwego ale bezużytecznego rachunku :
0 = 0 + 0
tytułem przykładu, oto niektóre kod C, która działa na zewnątrz równań że jesteś umieszczone w swoim pytaniu.Pierwsze pewne niezbędne typy, zmienne, funkcji wsparcia dla drukowania równanie, a początkiem 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;
Następnie redukcja trzech równań z trzema niewiadomymi do dwóch równań z dwiema niewiadomymi:
// 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 ("");
Następnie redukcja dwóch równań z dwiema niewiadomymi do jednego równania z jedną niewiadomą:
// 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 ("");
teraz, że mamy formułę typ number1 = unknown * number2
, możemy po prostu wypracować nieznaną wartość za pomocą unknown <- number1/number2
. Następnie, gdy już zorientujesz się, że wartość się zmieniła, podstaw ją na jedno z równań z dwoma niewiadomymi i wypracuj drugą wartość. Następnie zastąpić oba te (obecnie znane) niewiadomych w jednej z oryginalnych wzorów i teraz masz wartości dla wszystkich trzech niewiadomych:
// 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;
}
Wyjście z tego kodu pasuje do wcześniejszych obliczeń w tej odpowiedzi:
>: -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)
Inni ludzie odpowiedzieli, ale sprawdzić książkę * Analiza numeryczna: Mathematics of Scientific Computing * od Kincaid i Cheney. Książka w dużej mierze dotyczy rozwiązywania różnych układów równań. – Matthew