Algoritmo di gauss equazione circonferenza avendo 3 punti

di il
10 risposte

Algoritmo di gauss equazione circonferenza avendo 3 punti

Salve mi presento , mi chiamo muscolo matteo frequento il 3° programmatore per passare il tempo oggi ho deciso di creare un semplice programmino che svolge diverse funzioni l'unica di cui mi sfugge come farla è quella che dati 3 punti usando il metodo di Gauss trovi l'equazione della circonferenza nella forma x^2+y^2+ax+by+c , qualcuno ha qualche suggerimento da darmi ? grazie in anticipo per l'aiuto
questo è il codice che ho creato
#include <iostream>
#include <math.h>
#include <math.h>
using namespace std;
int main() {
int scelta;
int s,p;
do{
system("cls");
cout <<"cosa vuoi calcolare ? "<<endl;
cout<<"1) vertice, fuoco, asse di simmetria e direttrice di una parabola (dovrai specificare se nella forma y=ax^2+bx+c o x=ay^2+by+c "<<endl;
cout<<"2) equazione della circonferenza dati centro ed 1 punto"<<endl;
cout<<"3) equazione della circonferenza dati centro e raggio"<<endl;
cin>>scelta;
if (scelta==1){
cout<<"digita 1 se nella forma y=ax^2+bx+c o digita 2 se nella forma x=ay^2+by+c"<<endl;
cin>>s;
if(s==1){
float a,b,c,vx,vy,fx,fy,as,d,delta;
cout<<"inserisci equazione parabola nella forma y=ax^2+bx+c "<<endl;
cout<<"quanto vale a ? ";
cin>>a;
cout<<"quanto vale b ? ";
cin>>b;
cout<<"quanto vale c ? ";
cin>>c;
cout<<"la tua equazione della parabola è y=("<<a<<")x^2+("<<b<<")x+("<<c<<")"<<endl;
delta=pow(b,2)-4*a*c;
vx=-b/2*a;
vy=-(delta/4*a);
fx=-(b)/2*a;
fy=(1-delta)/(4*a);
as=fx;
d=-((1+delta)/4*a);
cout<<"il vertice è ("<<vx<<","<<vy<<")"<<endl;
cout<<"il fuoco è ("<<fx<<","<<fy<<")"<<endl;
cout<<"l'asse di simmetria è x="<<as<<endl;
cout<<"la direttrice è y="<<d<<endl;
}
else
if(s==2){
float a,b,c,vx,vy,fx,fy,as,d,delta;
cout<<"inserisci equazione parabola nella forma x=ay^2+by+c"<<endl;
cout<<"quanto vale a ? ";
cin>>a;
cout<<"quanto vale b ? ";
cin>>b;
cout<<"quanto vale c ? ";
cin>>c;
cout<<"la tua equazione della parabola è x=("<<a<<")x^2+("<<b<<")x+("<<c<<")"<<endl;
delta=pow(b,2)-4*a*c;
vy=-b/2*a;
vx=-(delta/4*a);
fy=-(b)/2*a;
fx=(1-delta)/(4*a);
d=fx;
as=-((1+delta)/4*a);
cout<<"il vertice è ("<<vx<<","<<vy<<")"<<endl;
cout<<"il fuoco è ("<<fx<<","<<fy<<")"<<endl;
cout<<"l'asse di simmetria è x="<<as<<endl;
cout<<"la direttrice è y="<<d<<endl;
}
}
else
if (scelta==2){
float c1,c2,p1,p2,r2;
cout<<"inserisci le coordinate del centro : cx=";
cin>>c1;
cout<<" ; cy=";
cin>>c2;
cout<<"inserisci le coordinate del punto : px=";
cin>>p1;
cout<<" ; py=";
cin>>p2;
r2=pow((p1-c1),2)+pow((p2-c2),2);
cout<<"l'equazione è : x^2+y^2+("<<2*(-c1)<<")x+("<<2*(-c2)<<")y+("<<pow(c1,2)+pow(c2,2)-r2<<")"<<endl;
}
else
if(scelta==3){
float r,r2,c1,c2;
cout<<"inserisci le coordinate del centro : ";
cout<<"cx=";
cin>>c1;
cout<<"cy=";
cin>>c2;
cout<<"inserisci il raggio : r=";
cin>>r;
r2=pow(r,2);
cout<<"l'equazione è : x^2+y^2+("<<2*(-c1)<<")x+("<<2*(-c2)<<")y+("<<pow(c1,2)+pow(c2,2)-r2<<")"<<endl;
}
cout<<"vuoi rieseguire il programma? digita 1 oppure dugita 0 per interrompere ";
cin>>p;
}while(p==1);
system("pause");
return 0;
}

10 Risposte

  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    Ciao, prima di tutto ti consiglio di postare il codice con gli appositi tag Code.
    Ad ogni modo, da quanto riesco a vedere dal codice non hai scritto niente relativamente al problema di trovare l'equazione della circonferenza noti 3 punti.
    Qual è il tuo dubbio esattamente?
    Sei in grado di risolvere il problema "a mano"?
    Se sì: descrivicelo e possiamo aiutarti a codificare l'algoritmo.
    Se no: allora si tratta di un problema di matematica e va chiarito.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    Per i tag ora li aggiungo, si "a mano" saprei risolverlo solo che si dovrebbero fare dei procedimenti che non ho idea di come andrebbero implementati in c++
    comunque ho riscritto il sorgente implementndo i sottoprogrammi
    
    #include <iostream>
    #include <math.h>
    #include <cstdlib>
    using namespace std;
        float delta(float &a, float &b, float &c){
              float delta=(b*b)-(4*a*c);
              return delta;
              }
        void Parabola(float &var1,float &var2,float &var3,float &var4,float &var5, float &var6){
                            float a,b,c;
                            cout<<"inserisci equazione parabola nella forma y=ax^2+bx+c "<<endl;
                            cout<<"quanto vale a ? ";
                            cin>>a;
                            cout<<"quanto vale b ? ";
                            cin>>b;
                            cout<<"quanto vale c ? ";
                            cin>>c;
                            cout<<"la tua equazione della parabola è y=("<<a<<")x^2+("<<b<<")x+("<<c<<")"<<endl;
                            cout<<"il delta è : "<<delta(a,b,c)<<endl;
                            var1=-b/(2*a);
                            var2=-(delta(a,b,c)/4*a);
                            var3=-b/(2*a);
                            var4=(1-delta(a,b,c))/(4*a);
                            var5=-b/(2*a);;
                            var6=-((1+delta(a,b,c))/(4*a));
             }
      
      void CirconferenzaCP()
      {
                            float c1,c2,p1,p2,r2;
                            cout<<"inserisci le coordinate del centro : cx=";
                            cin>>c1;
                            cout<<" ; cy=";
                            cin>>c2;
                            cout<<"inserisci le coordinate del punto : px=";
                            cin>>p1;
                            cout<<" ; py=";
                            cin>>p2;
                            r2=pow((p1-c1),2)+pow((p2-c2),2);
                            cout<<"l'equazione è : x^2+y^2+("<<2*(-c1)<<")x+("<<2*(-c2)<<")y+("<<pow(c1,2)+pow(c2,2)-r2<<")=0"<<endl;
      }
      void CirconferenzaCR(){
                             float r,r2,c1,c2;
                             cout<<"inserisci le coordinate del centro : ";
                             cout<<"cx=";
                             cin>>c1;
                             cout<<"cy=";
                             cin>>c2; 
                             cout<<"inserisci il raggio : r=";  
                             cin>>r;
                             r2=pow(r,2);       
                             cout<<"l'equazione è : x^2+y^2+("<<2*(-c1)<<")x+("<<2*(-c2)<<")y+("<<pow(c1,2)+pow(c2,2)-r2<<")=0"<<endl;
           }
      int main(){
          int sceltaconica;
          int scelta;
          int ripeti;
          float Vx,Vy,Fx,Fy,as,d;
          do{
          system("cls");
          cout <<"scegli una conica "<<endl;
          cout <<"1) parabola "<<endl;
          cout <<"2) circonferenza "<<endl;
          cout <<"3) ellisse "<<endl;
          cout <<"4) iperbole "<<endl;
          cin >>sceltaconica;
          if (sceltaconica==1)
          {
                              cout << "digita: "<<endl;
                              cout << "1) se nella forma y=ax^2+bx+c " << endl;
                              cout << "2) se nella forma x=ay^2+by+c" << endl;
                              cin>>scelta;
                             if (scelta==1){
                                                 Parabola(Vx,Vy,Fx,Fy,as,d);
                                            }
                             else 
                             if (scelta==2) {
                                                 Parabola(Vy,Vx,Fy,Fx,d,as);
                                            }  
                             cout << "il vertice e' ("<<Vx<<","<<Vy<<")" <<endl;
                             cout << "il fuoco e' ("<<Fx<<","<<Fy<<")" <<endl;
                             cout << "l'asse di simmetria e' x="<<as <<endl;
                             cout << "la direttrice e' y=" << d <<endl; 
          } 
          else              
          if (sceltaconica==2)
          {
                cout << "digita: " << endl;
                              cout << "1) se hai come dati centro ed un punto" << endl;
                              cout << "2) se hai come dati centro e raggio" << endl; 
                              cin >> scelta;  
                              if (scelta==1){
                                             CirconferenzaCP();
                                             }
                               else
                               if (scelta==2){
                                              CirconferenzaCR();
                                              }
          }
                   cout << "vuoi continuare ? digita" << endl;
                   cout << "digita 1 per continuare " << endl;
                   cout << "digita 0 per interrompere" << endl;
                   cin >>ripeti;
                }while(ripeti==1);
          system("pause");
          return 0;
          }
    
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    Mi è stato chiesto di intervenire in questo thread. Ammesso che l'OP sia ancora interessato (in genere questi velleitari "progetti" giovanili sono alquanto ondivaghi e incostanti), la soluzione è veramente banale, purché non ci ostini a percorrere strade impraticabili per uno studente di quell'età.

    Di primo acchito è facile farsi venire in mente non meno di una decina di soluzioni elementari al problema euclideo della circonferenza passante per tre punti non allineati, che peraltro si riduce al calcolo del circocentro di un triangolo: tra metodi geometrici, analitici, algebrici, matriciali e trigonometrici si possono riempire paginate di diversi approcci. Tuttavia, quasi nessuno di essi riveste interesse computazionale.
    La Via Regia in geometria computazionale consiste del calcolare l'intersezione delle mediane di due lati arbitrariamente scelti, che avviene appunto nel circocentro. Tipicamente si ottiene un sistema lineare e lo si risolve poi in precalcolo con i metodi più idonei (i.e. Cramer, che ai miei tempi si studiava al biennio del Liceo Scientifico insieme agli altri metodi di risoluzione dei sistemi lineari, quindi oggi forse ne parlano verso il quinto anno di una laurea magistrale mentre sul Lang ormai studiano solo i dottorandi più irriducibili ).
    Ciò può essere realizzato impiegando unicamente una sequenza di operazioni elementari, minimizzando in particolare moltiplicazioni e divisioni (eterno punctum dolens dell'architettura x86 e di tutti i compatibili a venire) e senza ricorso a funzioni della libreria matematica: ci si guardi bene dall'invocare addirittura la pow() per calcolare il quadrato di un binomio, per siffatte alzate di genio è prevista la fantozziana crocefissione in sala mensa con clisterone purificatore da cinque litri.

    L'immagine allegata, a meno di errori di digitazione, riporta le banalissime formulette machine-ready ottenute dalla risoluzione per una qualsiasi via (analitica, geometrica o matriciale) del problema dell'intersezione, splittate in funzione della massima efficienza di calcolo.
    Una volta ottenute in input le tre coppie di coordinate cartesiane richieste, si tratta di precalcolare dinamicamente in totale sette valori, usandoli poi nelle tre formulette finali, riportate in rosso. Si presti attenzione al fatto che il determinante può diventare nullo, dando luogo ad un caso degenere che andrà gestito a parte. Inoltre sarebbe opportuno verificare a monte che i tre punti non siano allineati, verificando che uno qualsiasi di essi non soddisfi l'equazione della retta passante per gli altri due.

    Come ultimo atto, si sostituiscono i tre valori facilmente ottenuti (coordinate del centro e quadrato del raggio) nella forma canonica dell'equazione della circonferenza dati centro e raggio.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    La stabilità numerica di quell'approccio potrebbe essere a rischio
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    La stabilità numerica di tale diffusissimo approccio è assolutamente granitica. Si dimostra banalmente (quasi sempre per esercizio, nei testi più seri) che Cramer è forward stable per n = 2, che è esattamente la dimensione del sistema risolutivo di questo e di ogni altro metodo d'intersezione in qualche centinaio di testi e in decine di applicazioni...

    Inoltre l'eventuale alternativa di mettere in mano ad uno studente ITIS del terzo anno una risoluzione esplicita con l'eliminazione gaussiana pare comunque totalmente fuori portata, oltre a non apportare alcun reale vantaggio dal punto di vista della stabilità e accuratezza.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    M.A.W. 1968 ha scritto:


    La stabilità numerica di tale diffusissimo approccio è assolutamente granitica. Si dimostra banalmente (quasi sempre per esercizio, nei testi più seri) che Cramer è forward stable per n = 2, che è esattamente la dimensione del sistema risolutivo di questo e di ogni altro metodo d'intersezione in qualche centinaio di testi e in decine di applicazioni...

    Inoltre l'eventuale alternativa di mettere in mano ad uno studente ITIS del terzo anno una risoluzione esplicita con l'eliminazione gaussiana pare comunque totalmente fuori portata, oltre a non apportare alcun reale vantaggio dal punto di vista della stabilità e accuratezza.
    Bhè con differenze multiple di coordinate (possibilmente) simili la cancellazione è dietro l'angolo (per i delta).

    Considerata poi che finirà al denominatore il loro prodotto (Det) non sarei così assertivo

    Sul secondo capoverso invece concordo.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    Al tempo. La soluzione proposta contiene unicamente formule algebriche in forma chiusa, volte a fornire una alternativa implementabile ad uno studente che non possiede gli strumenti matematici per svolgere autonomamente una simile derivazione e conosce solamente procedimenti algebrici ad hoc pencil&paper per sostituzioni successive.

    La stabilità di Cramer per la dimensione data non è oggetto di discussione: a fortiori per le aspettative dell'OP. Eventuali ulteriori osservazioni sull'implementazione (della quale finora non si è quasi parlato, essendo un esercizio per chi deve realizzarla) e sugli stranoti difetti e rischi del floating point binario, in questo momento, costituiscono solo una inutile anticipazione in un thread che probabilmente non riscuote più neppure l'interesse dell'OP.
    Se ci sono idee alternative e rimaneggiamenti algebrici da prendere in considerazione a fronte di errori tangibili nell'output, ciò che è opportuna e studiata parte del metodo didattico (e che ci aspettiamo placidamente, considerate le condizioni al contorno), se ne parlerà eventualmente al momento opportuno, senza anticipare inutilmente i tempi e senza congetturare sul nulla, in modo del tutto speculativo e non quantificato.

    Di fatto, quella proposta resta la miglior formulazione in assoluto da cui prendere il via in un contesto come il presente, quella che il compianto Forman Acton (RIP) approverebbe e farebbe nuovamente sua senza riserve, nettamente migliore dell'idea naif di usare differenze di quadrati, con tutto ciò di negativo che ne consegue. Il resto, se interessa, si vedrà dietro opportune domande. Tempo permettendo.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    Grazie per i consigli ma per me è araba la matematica quindi non ho compreso tutto comunque alla fine ho fatto il metodo di gauss usando le matrici.
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    matteo muscolo ha scritto:


    grazie per i consigli ma per me è araba la matematica quindi non ho compreso tutto comunque alla fine ho fatto il metodo di gauss usando le matrici.
    Benissimo. Cameriere! Pizza e birra per tutti!

    Resta comunque la curiosità di sapere quale tra o simili pencil&paper ti è stato propinato come "metodo di Gauss", mentre il povero Carl Friederich si rivolta probabilmente nella tomba, ricordando per inciso che anche le formulette proposte "usano le matrici".

    Visto che siamo OT, aggiungiamo una doverosa citazione. Una volta, su un glorioso forum di elettronica ormai scomparso tra le vestigia del passato, un noto fisico applicativo, progettista dirigente nella sede italiana di una nota multinazionale, raccontava di sua iniziativa un noto aneddoto storico, riportato in varie forme su vari testi di calcolo numerico e anche su un paio di pietre miliari di storia della matematica. L'amico MG ricordava come Gauss avesse in parte anticipato - pur senza formalizzarla pienamente - la struttura del modernissimo metodo di Cooley-Tukey per la FFT, avendone impellente necessità per un suo calcolo di effemeridi di corpi celesti minori, e aggiungeva accoratamente che tale metodo avrebbe dovuto portare anche il nome di Gauss: concludeva poi la sua perorazione considerando che "nonostante questa mancata attribuzione di paternità, per fortuna Gauss ha avuto lo stesso la gloria meritata". Tra le risate generali, non si mancò di far notare al brav'uomo (la cui preoccupazione, conoscendolo, era del tutto verace e sentita) che, anche cancellando tutti i riferimenti dispari al nome di Gauss dai testi e dagli articoli matematici circolanti, il suo sarebbe rimasto di gran lunga il nome più citato: non c'è settore della matematica pura e applicata che non vanti la sua brava mezza dozzina di contributi del Princeps Mathematicorum... senza contare, appunto, le attribuzioni del tutto apocrife, indirette o semplicemente inventate di sana pianta.


    Ultima nota: suggerisco di leggere "Il giornalino di Gian Burrasca" e di scoprire chi è il "Professor Muscolo". "Tutti fermi! Tutti zitti! Ché se vi vede Muscolo siete tutti fritti!".
  • Re: Algoritmo di gauss equazione circonferenza avendo 3 punti

    M.A.W. 1968 ha scritto:


    matteo muscolo ha scritto:


    grazie per i consigli ma per me è araba la matematica quindi non ho compreso tutto comunque alla fine ho fatto il metodo di gauss usando le matrici.
    Benissimo. Cameriere! Pizza e birra per tutti!

    Resta comunque la curiosità di sapere quale tra o simili pencil&paper ti è stato propinato come "metodo di Gauss", mentre il povero Carl Friederich si rivolta probabilmente nella tomba, ricordando per inciso che anche le formulette proposte "usano le matrici".

    Visto che siamo OT, aggiungiamo una doverosa citazione. Una volta, su un glorioso forum di elettronica ormai scomparso tra le vestigia del passato, un noto fisico applicativo, progettista dirigente nella sede italiana di una nota multinazionale, raccontava di sua iniziativa un noto aneddoto storico, riportato in varie forme su vari testi di calcolo numerico e anche su un paio di pietre miliari di storia della matematica. L'amico MG ricordava come Gauss avesse in parte anticipato - pur senza formalizzarla pienamente - la struttura del modernissimo metodo di Cooley-Tukey per la FFT, avendone impellente necessità per un suo calcolo di effemeridi di corpi celesti minori, e aggiungeva accoratamente che tale metodo avrebbe dovuto portare anche il nome di Gauss: concludeva poi la sua perorazione considerando che "nonostante questa mancata attribuzione di paternità, per fortuna Gauss ha avuto lo stesso la gloria meritata". Tra le risate generali, non si mancò di far notare al brav'uomo (la cui preoccupazione, conoscendolo, era del tutto verace e sentita) che, anche cancellando tutti i riferimenti dispari al nome di Gauss dai testi e dagli articoli matematici circolanti, il suo sarebbe rimasto di gran lunga il nome più citato: non c'è settore della matematica pura e applicata che non vanti la sua brava mezza dozzina di contributi del Princeps Mathematicorum... senza contare, appunto, le attribuzioni del tutto apocrife, indirette o semplicemente inventate di sana pianta.


    Ultima nota: suggerisco di leggere "Il giornalino di Gian Burrasca" e di scoprire chi è il "Professor Muscolo". "Tutti fermi! Tutti zitti! Ché se vi vede Muscolo siete tutti fritti!".
    lo leggerò
Devi accedere o registrarti per scrivere nel forum
10 risposte