Brauche Hilfe zum Lagrange Algorithmus



  • Hi zusammen,

    kann mir einer in meinem Code weiterhelfen, bin Anfänger möchte aber gerne den Lagrange Algorithmus implementieren.

    Folgenden Code habe ich schon geschafft. Kann mir einer weiterhelfen?

    #include<stdio.h>
    #define N 1000
    int main(void)
    {
    	int i,j,k;
    	float x[N],l[N],f[N],m[N];
    	float y,L;
    	printf("Bitte tragen sie die Anzahl der Stützsellen an:\n");
    	scanf("%d",&k);
    	printf("k\n");
    	printf("Bitte geben sie die x-Werte und die y-Werte der Stützstellen an:\n");
    	for (i=0; i<k; i++)
    	{
    	printf("%d. Stuetzstelle\n", i);
    	printf("\tBitte geben sie den x-Wert an: ");
    	scanf("%lf", &x[N]);
    	printf("\tBitte geben sie den y-Wert an: ");
    	scanf("%lf", &f[N]);
    }
    
    	printf("Bitte geben Sie den x-Wert an den Sie mithilfe der Lagrange-Interpolation auswerten wollen:\n");
    	scanf("%f",&y);
    
    	for(i=0;i<k;i++)
    	{
    		for(j=0,l[i]=1;j<k;j++)
    		{
    			if(j==i)
    				m[j]=1;
    			else
    				m[j]=(y-x[j])/(x[i]-x[j]);
    
    			l[i]=l[i]*m[j];
    		}
    	}
    	for(i=0,L=0;i<k;i++)
    		L=L+l[i]*f[i];
    
    	printf("Der Funktionswert ist:%f\n",L);
    	system("Pause");
    	return(0);
    }
    

    Um Tipps wäre ich dankbar:)



  • und deine Frage lautet... ?


  • Mod

    Apfelwurm schrieb:

    Um Tipps wäre ich dankbar:)

    • Sprechende Variablennamen verwenden: Was ist i,j,k,x,l,f,m,N,y,L? Das weißt du in zwei Tagen selber nicht mehr, wie soll das ein Fremder verstehen?
    • Falls du C99 machst, darfst du deine Variablen auch mitten im Quelltext deklarieren, das erhöht die Übersichtlichkeit.
    • Gibt's spezielle Gründe für float anstatt double?
    • Können i,j,k negativ sein? Falls nein, wäre veilleicht ein unsigned Datentyp besser. (Ist aber ein kontroverser Ratschlag, weil Falscheingaben schlechter Identifiziert werden können)
    • Hat die Zahl 1000 eine spezielle magische Bedeutung? Wohl kaum. Du fragst doch sogar die Zahl der Stützstellen explizit ab, warum benutzt du diese Zahl dann nicht um ein Array mit genau passender Größe anzulegen?
    • Wenn Wutz jetzt da wäre, würde er dir sagen, dass Rückgabewerte (z.B. von scanf) dazu da sind, geprüft zu werden.
    • Der Formatspezifizierer %lf erwartet double, du gibst ihm float.
    • system wird im Header stdlib.h deklariert
    • Das was du da mit system machst ist hochgradig unportabel


  • Ich danke für die Antwort. Ich werde den Code überarbeiten und nochmal posten, mal schaun ob ich dann weiter komme:)
    thx


  • Mod

    Apfelwurm schrieb:

    Ich danke für die Antwort. Ich werde den Code überarbeiten und nochmal posten, mal schaun ob ich dann weiter komme:)
    thx

    Wobei ich vielleicht noch anmerken sollte, dass meine Kommentare oben superkritisch sind. An sich schaut das gar nicht so schlecht aus. Aber da deine Frage so vage gestellt war, habe ich eben alles geschrieben was mir einfiel.



  • SeppJ schrieb:

    • Falls du C99 machst, darfst du deine Variablen auch mitten im Quelltext deklarieren, das erhöht die Übersichtlichkeit.
    • Der Formatspezifizierer %lf erwartet double, du gibst ihm float.

    Ob die Variablendeklaration mitten im Quelltext auch nur irgendwas lesbarer macht, darüber läßt sich trefflich streiten - ich finde es schauderhaft. Damit rückt das eher in die Darlegung des persönlichen Geschmacks. Muß man also nicht anmerken.

    Der %f Formatspezifizierer ist für float und double korrekt, der Längenspezifizierer l ist nur für (unsigned) long int zulässig. Für einen long double gibt's den %Lf.



  • Ihr seid echt hilfsbereit, das ist echt super. Ich werde mich jetzt an den Code setzen und erläutere auch gerne heute Nachmittag den Algorithmus mit dem entsprechenden Rechenbeispiel. Hoff. mein Code klappt heute Nachmittag, falls nicht wäre ich euch dankbar, wenn ich euch nochmal um Rat fragen könnte.
    THX



  • pointercrash() schrieb:

    Der %f Formatspezifizierer ist für float und double korrekt, der Längenspezifizierer l ist nur für (unsigned) long int zulässig. Für einen long double gibt's den %Lf.

    Dies gilt für printf.

    Bei scanf muss man aber für double %lf angeben, denn scanf sollte schon wissen wie viel Bytes es schreiben darf.



  • DirkB schrieb:

    Dies gilt für printf.

    Bei scanf muss man aber für double %lf angeben, denn scanf sollte schon wissen wie viel Bytes es schreiben darf.

    Aua, aua, aua 😞
    Kalt erwischt, pure Schlamperei .. natürlich hast Du recht und ich Blödsinn verzapft!


Anmelden zum Antworten