standort problem mit fixpunktverfahren loesen



  • Hallo NG,

    ich habe unten ein Programm geschrieben, mit dem
    ein optimaler Standort ausgegeben werden soll.
    In Klartext, Gesucht sind die Koordinaten einer zentralen
    Verteilstelle (x,y), sodass die Summe aller Entfernungen
    zu den Standorten ((xi, yi)) minimal wird:

    e(x,y) = ∑i ( ( x-xi)2 + ( y-yi)2) 1/2

    Das klappt eigentlich ganz gut mit Null als Ursprung.
    Jetzt muss ich aber die Aufgabe so umschreiben,
    dass der Koordinatenursprung bei Frankfurt liegt.
    Wie koennte ich das implementieren?

    Waere fuer jede Hilfestellung dankbar.

    #include <stdio.h>
    #include <math.h>
    const int n = 13;              /* 13 Staedte */
    
    const double x[]={48150, 48767, 49005, 51300, 51050,
    50117, 50933, 51217, 53550, 53083, 54550, 52517, 52367};
    
    const double y[]={11583,  9183,  8386, 12333, 13750,
    8683,  6950,  6767, 10000,  8800,  9167, 13400,  9717};
    
    /* Koordinaten fuer folgende Staedte, in der Reihenfolge(Luftlinie) -
    Muenchen, Stuttgart, Karlsruhe, Leipzig, Dresden, Frankfurt, Koeln,
    Duesseldorf, Hamburg, Bremen, Kiel, Berlin, Hannover  */
    
    void main()
    {
        double xp, yp, xpn, ypn;
        double sum1, sum2, sum3, term, abstand;
    
        int i, iterzahl;
        xpn = 51277.38;
        ypn = 9900.08;    /* Mittelwert x=51277.38 und y=9900.08 */
        iterzahl = 0;
    
        do
    
        {
        xp=xpn;
        yp=ypn;
        iterzahl++;
        sum1=0;
        sum2=0;
        sum3=0;
    
        for(i=0; i<n; i++)
        {
        term=1/sqrt(pow(xp-x[i],2)+pow(yp-y[i],2));
        sum1=sum1+term;
        sum2=sum2 + x[i]*term;
        sum3=sum3 + y[i]*term;
        }
    
    /* Extremalbedingung wird in Fixpunktform gebracht */
    
        xpn = sum2/sum1;
        ypn = sum3/sum1;
    /*  printf("\n %.2f", xpn); */
        }
    
        while(fabs(xp-xpn)+fabs(yp-ypn)>1e-8 && iterzahl<100);
    /* abbrechen,wenn die Naehrung sich um weniger als 10^-6 unterscheiden */
    
        printf("\nX-Wert: %.2f     Y-Wert: %.2f", xpn, ypn);    /* Koordinaten
    ausgeben */
        printf("\n%i", iterzahl);                               /* Iterationen
    ausgeben */
    
    }
    


  • Ziehe doch einfach von alle Koordinaten diejenigen von Frankfurt ab.


Log in to reply