Se si limita a voi stessi di quel tipo di funzioni lineari mostrate sopra, si potrebbe generalizzare la funzione come questa
3x - 5y + z = 5
sarebbe diventato
a[0]*x[0] + a[1]*x[1] + a[2]*x[2] = c
con a = { 3, -5, 1 }
e c = 5
.
Vale a dire, hai bisogno di una lista (o array) di fattori costanti List<double> a;
e un elenco di variabili List<double?> x;
più il costante sul lato destro double c;
public double Solve(IList<double> a, IList<double?> x, double c)
{
int unknowns = 0;
int unkonwnIndex = 0; // Initialization required because the compiler is not smart
// enough to infer that unknownIndex will be initialized when
// our code reaches the return statement.
double sum = 0.0;
if (a.Count != x.Count) {
throw new ArgumentException("a[] and x[] must have same length");
}
for (int i = 0; i < a.Count; i++) {
if (x[i].HasValue) {
sum += a[i] * x[i].Value;
} else {
unknowns++;
unknownIndex = i;
}
}
if (unknowns != 1) {
throw new ArgumentException("Exactly one unknown expected");
}
return (c - sum)/a[unknownIndex];
}
Esempio:
3x - 5y + z = 5
5 - (- 5y + z)
x = --------------
3
come si è visto nell'esempio la soluzione consiste nel sottrarre la somma di tutti i termini ad eccezione del termine sconosciuto dalla costante e quindi di dividere per il fattore dell'ignoto. Pertanto la mia soluzione memorizza l'indice dell'ignoto.
Si può generalizzare con poteri come questo, a patto che abbiate l'equazione
a[0]*x[0]^p[0] + a[1]*x[1]^p[1] + a[2]*x[2]^p[2] = c
è necessario un ulteriore parametro IList<int> p
e il risultato diventa
return Math.Pow((c - sum)/a[unknownIndex], 1.0/p[unknownIndex]);
come x^(1/n)
è pari a nth-root(x)
.
Se si utilizza raddoppia per i poteri, si sarà anche in grado di rappresentare le funzioni come
5
7*x^3 + --- + 4*sqrt(z) = 11
y^2
a = { 7, 5, 4 }, p = { 3, -2, 0.5 }, c = 11
perché
1
x^(-n) = ---
x^n
e
nth-root(x) = x^(1/n)
Tuttavia, è non sarà in grado di trovare le radici di tr ue polinomi non lineari come x^2 - 5x = 7
. L'algoritmo mostrato sopra, funziona solo se lo sconosciuto appare esattamente una volta nell'equazione.
'+ 1' per generalizzare correttamente la mia idea. Non ho pensato di utilizzare un elenco come argomento – BradleyDotNET
Se si utilizzano elenchi o array dipende dalla flessibilità richiesta. Dato che entrambi implementano 'IList' Ho cambiato i parametri in 'IList' –
'Suppongo che questo sia solo un semplice finder di base per le equazioni lineari, ma è generalizzabile a dimensioni superiori se necessario e non richiede alcuna ramificazione condizionale basata sulla conoscenza precedente di cui era l'ignoto.Penso che implementerò questo, grazie! – topher