risolvere sistemi messi in forma normale

Stato
Discussione chiusa ad ulteriori risposte.

imported_Bronsa

Utente Silver
28 Ottobre 2007
108
6
0
82
Calcolare il valore di x e y in un sistema ridotto a forma normale

trovare il valore di x e di y in un sistema di equazioni posti in forma normale ovvero
su
aX + bY =c
a1X +b2Y =c"
trovare qunto vale x e y...(a,b,c,a1,b1,c1 stanno per dei numeri...)
Codice:
<html>

<body>
<p><font size="6"><center><b>INSERISCI I VALORI </b></center></font></p>


<form action ="sistema.php" method ="post">
<input type="text" name="a1" />
* x
<input type="text" name="b1" />
* y =
<input type="text" name ="c1" />
<br>
<input type="text" name="a2" />
* x
<input type="text" name="b2"/>
* y =
<input type="text" name ="c2" />
<input type="submit" value="calcola"/>
</form>


</body>
</html>



sistema.php
PHP:
<html>
<body>


<?Php

$a1 = $_POST['a1'];
$b1 = $_POST['b1'];
$c1 = $_POST['c1'];
$a2 = $_POST['a2'];
$b2 = $_POST['b2'];
$c2 = $_POST['c2'];

$d = $a1 * $b2 - $a2 * $b1;
echo "D = $a1 * $b2 - $a2 * $b1 <br>";
echo "D= $d <br><br>";
$dx = $c1 * $b2 - $c2 * $b1;
echo "Dx = $c1 * $b2 - $c2 * $b1 <br>";
echo "Dx= $dx <br><br>";
$dy = $b1 * $c2 - $b2 * $c1;
echo "Dy = $b1 * $c2 - $b2 * $c1 <br>";
echo "Dy= $dy <br><br>";

echo "D * X = Dx <br>";
echo "D * Y = Dy <br><br>";

echo "$d X = $dx <br>";
echo "$d Y = $dy <br><br>";

$x = $dx / $d;
$y = $dy / $d;

echo "X = $x <br>";
echo "Y = $y <br>";

?>

</body>
</html>

questo è col sitema di cramer lo farò anche con il metodo a eliminazione
 
trovare il valore di x e di y in un sistema di equazioni posti in forma normale ovvero
su
aX + bY =c
a1X +b2Y =c"
trovare qunto vale x e y...(a,b,c,a1,b1,c1 stanno per dei numeri...)

se hai 14 anni presumo che tu sia in 1 superiore quindi non dovresti aver ancora fatto i sistemi..per questo non hai capito :p
 
bronsa ha detto:
trovare il valore di x e di y in un sistema di equazioni posti in forma normale ovvero
su
aX + bY =c
a1X +b2Y =c"
trovare qunto vale x e y...(a,b,c,a1,b1,c1 stanno per dei numeri...)

se hai 14 anni presumo che tu sia in 1 superiore quindi non dovresti aver ancora fatto i sistemi..per questo non hai capito :p
infatti ma ci provo in java
per vedere se ci riesco
 
R4z0r_Cr4$H ha detto:
[ot]bronsa...posta nel tuo primo messaggio cosa chiede l'esercizio....[/ot]
fatto..credevo di essere stato esauriente ma evidentemente no:asd:
kripnos ha detto:
bronsa ha detto:
trovare il valore di x e di y in un sistema di equazioni posti in forma normale ovvero
su
aX + bY =c
a1X +b2Y =c"
trovare qunto vale x e y...(a,b,c,a1,b1,c1 stanno per dei numeri...)

se hai 14 anni presumo che tu sia in 1 superiore quindi non dovresti aver ancora fatto i sistemi..per questo non hai capito :p
infatti ma ci provo in java
per vedere se ci riesco
se vuoi ti dico le operazioni da fare...
 
[ot]lo sei stato,ma era meglio metterlo al primo messaggio in modo che uno leggesse tutto insieme xD!Ragazzi non quotate sempre,basta dire tipo: @kripnos:bla bla bla....[/ot]
 
ecco prima ne faccio uno in C cosi da capirmi....
usando WIKIPEDIA
Codice:
#include <stdio.h>
/*
* author:         kripnos
* title:             sistemi di equazioni
*/
int x;
int y;
int x1;
int y1;
int z1;
int x2;
int y2;
int z2;
int r1;
int rx;
int ry;

int main(){
printf("x1 =\t");
scanf("%d",&x1);
printf("\n y1 =   \n");
scanf("%d",&y1);
printf("\nQuanto vale z1: ");
scanf("%d",&z1);
printf("\nQuanto vale x2: ");
scanf("%d",&x2);
printf("\nQuanto vale y2: ");
scanf("%d",&y2);
printf("\nQuanto vale z2: ");
scanf("%d",&z2);
r1 = x1 * y2 - x2 * y1;
printf("\nD = %d  * %d -  %d *  %d", x1 , y2 , x2, y1);
printf("\nD= %d \n\n", r1);
rx =  z1 * y2 - z2 * y1;
printf("Dx = %d * %d  - %d  * %d  \n",z1 , y2 ,z2 , y1);
printf("Dx = %d \n\n", rx);
ry = y1 * z2 - y2 * z1;
printf("Dy = %d * %d - %d * %d  \n ",y1 , z2, y2 , z1);
printf("Dy= %d", ry);
printf(" \n D * X = %d ", rx);
printf(" \n D * Y = %d", ry);
x = rx / r1;
y = ry / r1;

printf("\nX = %d", x);
printf("\nY = %d\n", y);
printf("##############################\n");
printf("# x1 = %d \t #    x2 = %d\t #\n", x1, x2);
printf("# y1 = %d \t #    y2 = %d\t #\n", y1, y2);
printf("# z1 = %d \t #    z2 = %d\t #\n", z1, z2);
printf("##############################\n");
}


@razor : ok ok.......................
vi piace il mio codice ( risolto errore!!)
P.S: @bronsa: scusa se ho imitato il tuo codice
 
kripnos ha detto:
ecco prima ne faccio uno in C cosi da capirmi....
usando WIKIPEDIA
Codice:
#include <stdio.h>
/*
* author:         kripnos
* title:             sistemi di equazioni
*/
int x;
int y;
int x1;
int y1;
int z1;
int x2;
int y2;
int z2;
int r1;
int rx;
int ry;

int main(){
printf("x1 =\t");
scanf("%d",&x1);
printf("\n y1 =   \n");
scanf("%d",&y1);
printf("\nQuanto vale z1: ");
scanf("%d",&z1);
printf("\nQuanto vale x2: ");
scanf("%d",&x2);
printf("\nQuanto vale y2: ");
scanf("%d",&y2);
printf("\nQuanto vale z2: ");
scanf("%d",&z2);
r1 = x1 * y2 - x2 * y1;
printf("\nD = %d  * %d -  %d *  %d", x1 , y2 , x2, y1);
printf("\nD= %d \n\n", r1);
rx =  z1 * y2 - z2 * y1;
printf("Dx = %d * %d  - %d  * %d  \n",z1 , y2 ,z2 , y1);
printf("Dx = %d \n\n", rx);
ry = y1 * z2 - y2 * z1;
printf("Dy = %d * %d - %d * %d  \n ",y1 , z2, y2 , z1);
printf("Dy= %d", ry);
printf(" \n D * X = %d ", rx);
printf(" \n D * Y = %d", ry);
x = rx / r1;
y = ry / r1;

printf("\nX = %d", x);
printf("\nY = %d\n", y);
printf("##############################\n");
printf("# x1 = %d \t #    x2 = %d\t #\n", x1, x2);
printf("# y1 = %d \t #    y2 = %d\t #\n", y1, y2);
printf("# z1 = %d \t #    z2 = %d\t #\n", z1, z2);
printf("##############################\n");
}


@razor : ok ok.......................
vi piace il mio codice ( risolto errore!!)
P.S: @bronsa: scusa se ho imitato il tuo codice



Evita variabili globali, dichiarale nelle funzioni che ti servono (in questo caso dentro al main). Per il resto, identazione!
 
Il metodo di Cramer va bene solo per sistemi 2x2. Volendolo estendere ai sistemi 3x3 bisognerebbe ricorrere a Sarrus, ma si rimarrebbe comunque in un ambito limitato. Per sistemi generici n*n non usate Cramer. Usate le forme di riduzioni a gradini di Gauss e fattorizzazione LR, sono algoritmi più stabili e molto più generici per sistemi di qualsiasi tipo. Nella mia libreria Grassmann, se vi interessa, ho implementato proprio quelli.
 
BlackLight ha detto:
Il metodo di Cramer va bene solo per sistemi 2x2. Volendolo estendere ai sistemi 3x3 bisognerebbe ricorrere a Sarrus, ma si rimarrebbe comunque in un ambito limitato. Per sistemi generici n*n non usate Cramer. Usate le forme di riduzioni a gradini di Gauss e fattorizzazione LR, sono algoritmi più stabili e molto più generici per sistemi di qualsiasi tipo. Nella mia libreria Grassmann, se vi interessa, ho implementato proprio quelli.

no cioè si insomma...quello che dicono tutti no?

apparte gli scherzi..ma parlare in italiano no?:asd:

la mia conoscenza dei sistemi si limita al metodo di cramer quello grafico e quello a riduzione...
 
ecco il mio in c++(che però si crasha -.-), qualcuno sarebbe così gentile da spiegarmi perchè?

Codice:
/*Questo Programma Risolve Un Sistema Di Due Equazione di secondo grado 
ridotta in forma normale usando il metodo di cramer*/
#include <iostream>
using namespace std;

int main()
{
    int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,;
    double x,y;
    cout << "*********Prima Equazione*********\n";
    cout << "Inserisci Coefficente X\n";
    cin >> a;
    cout << "Inserisci Coefficente Y\n";
    cin >> b;
    cout << "Inserisci Risultato\n";
    cin >> c;
    cout << "*********Seconda Equazione*********\n";
    cout << "Inserisci Coefficente X\n";
    cin >> d;
    cout << "Inserisci Coefficente Y\n";
    cin >> e;
    cout << "Inserisci Risultato\n";
    cin >> f;
    g=a*e;
    h=b*d;
    i=a*f;
    j=c*d;
    k=c*e;
    l=f*b;
    m=g-h;
    n=i-j;
    o=k-l;
    x=o/m;
    y=n/m;
    cout << "Il Valore di X e' " << x << "\n";
    cout << "Il valore di Y e' " << y << "\n";
    cout << "\n\nBy Lepa";
    return 0;
}

edit: cioè, mi si crasha dopo aver inserito il risultato della seconda equazione
riedit: dimenticavo:questo è il mio primo programma in c++!!!!!!!:D
 
A me va tranquillamente...ma considerando che non fai controlli sull'indeterminatezza del sistema, e quindi su eventuali divisioni per zero, non mi sorprende che per alcuni valori inseriti possa crashare.

p.s. Hai messo una virgola di troppo dopo la dichiarazione delle variabili intere. E poi, va bene che è il tuo primo programma in C++, ma usare una tale sfilza di variabili invece degli array e addirittura usare variabili anche per memorizzare dati di appoggio rende il programma qualcosa di inguardabile...
 
ok grazie del consiglio, ho messo tante variabili per evitare di sbagliare a calcolare qualcosa, più che altro non sapevo se accettava qualcosa tipo x=(y*z)-(a*b) senza usare altre librerie oltre a iostream, in quanto non sapevo il nome di esse...
però in effetti potevo provarci...
edit:è vero, non crasha sempre....
 
Certo che prende operazioni matematiche in qualsiasi forma e con un numero arbitrario di parentesi e operatori. Come d'altronde tutti i linguaggi di programmazione...
 
ecco... l'ho migliorato(credo):

Codice:
#include <iostream>
using namespace std;

int main()
{
    int a,b,c,d,e,f;
    double x,y;
    cout << "*******Prima Equazione*******\n";
    cout << "Inserisci Coefficente Di X\n";
    cin >> a;
    cout << "Inserici Coefficente Di Y\n";
    cin >> b;
    cout << "Inserisci Il Risultato Dell'Equazione\n";
    cin >> c;
    cout << "\n*******Seconda Equazione*******\n";
    cout << "Inserisci Coefficente Di X\n";
    cin >> d;
    cout << "Inserisci Coefficente Di Y\n";
    cin >> e;
    cout << "Inserisci Risultato Equazione\n";
    cin >> f;
    while (a*e==d*b && c*e==b*f) cout << "X è indeterminato";
    while (a*e==d*b && a*f==d*c) cout << "Y indeterminato";
    if (a*e==d*b) cout << "Il risultato è impossibile";
    else {
          x=(c*e-b*f)/(a*e-d*b);
          y=(a*f-d*c)/(a*e-d*b);
          cout << "Il Valore di X e' " << x << "\n";
          cout << "Il valore di Y e' " << y << "\n";
          }
          cout << "\n\t\t\t\t\tBy Lepa";
    return 0;
}
 
l'esercizio richiede una risoluzione di sistema 2x2 ridotto in forma normale, quindi in tal caso cramer sarebbe il migliore, cmq altrimenti si potrebbe operare per sostituzione (che funziona sempre) anche se questo risulterebbe + lungo
 
@malex:mmmmmm bell'idea che mi hai dato....
edit:ripensandoci non so nemmeno cosa siano i sistemi 3X3....-.- meglio lasciare perdere....
 
@lepa: i sistemi 3x3 soso sistemi a 3 incognite con 3 equazioni

testato con un paio di sistemi e funziona, è chiaramente da sistemare ma l'ho fatto i 5 min

ecco il codice, che utilizza una formula che ho ricavato dal metodo di sotituzione:

Codice:
print "Inserire le due equazioni, nel seguente modo: ax+by=c, dove a,b e c sono numeri."

def get(s):
    a=float(s.split('x')[0])
    b=float((s.split('x')[1]).split('y')[0])
    c=float(s.split('=')[1])
    return [a,b,c]

s1=get(raw_input("Inserisci la prima "))
s2=get(raw_input("Inserisci la seconda "))


y=((s2[2]-((s2[0]*s1[2])/s1[0]))/(s2[1]-((s2[0]*s1[1])/s1[0])))
x=(s1[2]-(s1[1]*y))/s1[0]

print "x="+str(x)+'\n'+"y="+str(y)

ho sistemato l'errore di calcolo nell'algoritmo, che era (come al solito per quanto mi riguarda) un - che era diventato +


edit: vi posto la formula pure ed il ragionamento che ho usato:
Codice:
avendo:
ax+by=c
a1x+b1y=c1
esplicitando la x ed applicando il metodo di sostituzione:
(ax)/a=(c-by)/a
a1((c-by)/a)+b1y=c1
eseguendo il prodotto, raccogliedo a fattor comune la y e poi eplicitandola di ottiene:
x=(c-by)/a
y=(c1-((a1*c)/a))/(b1-((a1*b)/a))
 
@Malex: Dato un sistema qualsiasi devi fornire al computer un algoritmo univoco per la risoluzione per via deterministica. Il metodo di sostituzione è intuitivo da fare a mano, ma molto meno intuitivo da implementare in un algoritmo. È molto più facile istruire il computer attraverso metodi apparentemente meno intuitivi, come Cramer o la triangolarizzazione di Gauss, ma relativamente "meccanici" e deterministici, piuttosto che provare a implementare metodi umanamente più semplici ma che richiederebbero un enorme lavoro di traduzione di tutte le condizioni per essere trasformati in algoritmi validi (oltre a una notevole complessità algoritmica maggiore rispetto a Cramer, che in forma normale per un sistema 2x2 ha complessità praticamente nulla).

@lepa: Semplicemente, se un sistema 2x2 è un sistema di 2 equazioni in 2 incognite, un sistema 3x3 è un sistema di 3 equazioni in 3 incognite. È altrettanto semplice da implementare in maniera algoritmica, se vi interessa guardatevi l'algoritmo di Sarrus per il calcolo del determinante delle matrici 3x3 (semplicissimo al pari di quello di Cramer per le 2x2). Quando l'ordine del sistema, e quindi della matrice completa che ne viene fuori, diventa maggiore di 3, è invece indispensabile ricorrere a metodi più complessi e sofisticati (triangolarizzazione di Gauss, calcolo del determinante in modo ricorsivo con Laplace, e simili). Se volete vedere come implementare questi metodi, nella mia libreria Grassmann trovate tutto ^^

Anzi, nella mia libreria c'è un metodo a cui, passando la matrice dei coefficienti delle incognite e il vettore dei termini noti, fornisce direttamente la soluzione del sistema associato, se esiste. In pratica si tratta di vedere il sistema non come una successione di n equazioni in n incognite ma come un'unica equazione matriciale

Ax = b

dove A è la matrice dei coefficienti delle equazioni, x il vettore delle incognite (da determinare) e b il vettore dei termini noti. Ad esempio, per

2x + 1 = 3
x + y = 2

Avremo

Codice:
A = (2   1)
    (1   1)

e

b = (3)
    (2)

Visto in questo modo, la soluzione del sistema, ovvero il vettore x, si calcola come

x = A-¹ b

Se vedete il sistema di equazioni in questa forma molto più generica, e non come semplice successione di equazioni da risolvere meccanicamente con Cramer, potete implementare algoritmi più generici per la risoluzione di sistemi di equazioni di qualsiasi dimensione. E infatti, grazie a Gauss, nel metodo solve() della mia libreria è possibile passare direttamente la matrice A e il vettore b e viene subito fornito il vettore delle soluzioni x del sistema.
 
Stato
Discussione chiusa ad ulteriori risposte.