komplexe Übertragungsfunktion
-
Hallo liebe Leser.
Ich habe da ein C Projekt für die Uni, dass mich ein wenig überfordert. Ich habe leider noch nicht so viel Ahnung von C und darum bin ich auf Hilfe angewiesen. Ich probiere heute schon den ganzen Tag herum aber rausgekommen ist noch nichts.
Ich würde gern mit diesem Projekt und mit eurer Hilfe das Ganze nachvollziehen und ein Verständnis erlangen.Also Problem 1:
Folgende Aufgabenstellung.
http://www.bilder-hochladen.tv/pic/oke3Yyr8/
Was ich gemacht hab ist die Werte als const double. Dann habe ich noch versucht eine Fuktion für Y zu schreiben. Problem ist dann schon mal dass ich ja keine komplexe Zahl hab mit der ich rumrechnen kann und zum anderen muss ich den Leitwert erst mal berechnen um ihn dann einzusetzen..naja und irgendwie häng ich an diesem Punkt. Irgendwo is da ein Denkfehler bzw. fehlt einfach die zündende Idee. Ich hoffe ihr könnt mir helfen. Bei Fragen zur Materie kann ich einigermaßen weiterhelfen...
Danke schon mal
Gruß scontch
-
C99 hat einen eingebauten Datentypen für komplexe Zahlen (complex).
Wenn Du das nicht verwenden darfst, dann erstelle eine kleine struct mit Real- und Imaginärteil (jeweils float oder double). Darauf läuft die Sache wohl hinaus, denn die Grundrechenarten sollst Du ja selbst implementieren.
-
Du bildest eine Struktur mit zwei double oder float werten für den Realteil (re) und den Imaginärteil(im).
struct komplexeZahl { float re; float im }
Dann baust du eine funktion für die Addition, Multiplikation, usw. gemäß der Aufgabenstellung.
Bei der Addition sähe das ungefähr so aus:
komplexeZahl add(k1 komplexeZahl, k2 komplexeZahl) { komplexeZahl k3; k3.re = k1.re + k2.re; k3.im = k1.im + k2.im; return k3; }
-
Ich glaube bei mir haperts eher noch am Verständnis
Aber ich versuch mal zu erklären was ich machen will. Also
1. Berechne ich den ganzen Salat in der Klammer (normal) somit hab ich schon mal einen Imaginärteil.
2. Einsetzen in die Übertragungsfunktion. Jetz hab ich da schöne komplexe Zahlen stehen.
3. Mit den selbst geschirebenen Funktionen die Übertragungsfunktion so berechnen dass sie wieder in der Form a+ib dasteht.
4. Amplitude und Phase mit Betrag bzw. argtan berechnen.Sehe ich das so richtig oder hab ich noch Denkfehler drin??
Bitte um schnelle Antwort(en), da ich heute gerne diesen Aufgabenteil lösen würde und heute Abend stolz auf einen C Code blicken würde
Vielen Dank
scontch
edit:
Also zu Punkt 1 hab ich folgende Funktion:
double Y (double omega)
{
int C1 = 4e-12;
int C2 = 10e-12;
double L = 0.1e-3;
double y;y = omega * (C2 / (1 - omega*omega * L * C2) - C1);
return(y);
}Richtig so?
Oder sollte ich y als double complex und gleich ein y= I*omega.....
machen, damit mein return, also das, was ich dann in die Übertragungsfunktion einsetze eine complexe Zahl ist??
-
Hier ein wenig Pseudocode.
komplexeZahl ist ein struct wie von MrBesserwisser vorgeschlagen. Die Aufgabenstellung sagt ja, dass die benötigten Rechenoperationen für komplexe Zahlen eigenständig zu implementieren sind.komlexeZahl H(double omega) { komplexeZahl Y; Y.re = 0; Y.im = Klammersalat; komplexeZahl u1, u2; //R*Y u2.re = R*Y.re; u2.im = R*Y.im; //1+R*Y u1.re = 1 + u2.re; u1.im = u2.im; komplexeZahl H = div(u2,u1); return H; } komplexeZahl div(k1 komplexeZahl, k2 komplexeZahl) { ...}
-
ich hab des gleiche problem wie du aber ich habe glaub ich noch weniger ahnung also ich bitte auch um hilfe
bin aber auch nicht wirklich weiter gekommen durch des bisher gepostete
-
Sodala. Heute Vormittag hab ich mich dann mal drangesetzt und komm schon zum nächsten Problem
Also Code ist bis jetzt:
/********************************/ /* */ /*Titel: Übertragungsfunktion*/ /*von: *** */ /* */ /********************************/ #include <stdio.h> #include <math.h> struct cZahl { double Re; double Im; }; // Deklarieren eines structs mit den Eigenschaften 'Im' und 'Re' const double C1 = 4e-12; const double C2 = 10e-12; const double L = 0.1e-3; const double R = 470; // Deklarieren der vorgegebenen Werte als Konstanten double omega = 10; double Y (double omega); int main (void) { struct cZahl cZahl1; cZahl1.Re = 0; cZahl1.Im = Y(omega); struct cZahl cZaehler; cZaehler.Re = 0; cZaehler.Im = cmulti(Y(omega)); printf ("%e,%e", cZahl1.Re, cZahl1.Im); getchar(); return 0; } double Y (double omega) { double y; y = omega*(C2/(1-omega*omega*L*C2)-C1); return y; } double cmulti (double y) { struct cZahl Erg1; Erg1.Re = R * cZahl1.Re; Erg1.Im = R * cZahl1.Im;
Jetzt cZahl1 ist kein Bezeichner...????
Ja is mir schon klar, der Bezeichner ist Re/Im, aber er muss ja wissen welchen er hernehmen soll....
-
cZahl1 ist in der Funktion cMulti1 nicht verfügbar.
-> Etwas über den Scope von Variablen nachlesen.
Wie lange kann man sich eigentlich mit so einer Kindergartenaufgabe beschäftigen?
-
Naja, wenn es so einfach ist, dann tu dir keinen Zwang an und schick mir den Code. Für mich als Anfänger und ohne dem Ziel mit zutiefst mit C zu befassen, reichts schon aus....
-
Ich habe da ein C Projekt für die Uni, dass mich ein wenig überfordert. Ich habe leider noch nicht so viel Ahnung von C und darum bin ich auf Hilfe angewiesen.
Für mich als Anfänger und ohne dem Ziel mit zutiefst mit C zu befassen...
Oh je, ist ein bischen wenig Motivation für die Uni, oder nicht ? Nur weil Programmieren nicht dein Hauptfach zu sein scheint, solltest du es nicht ablehnen.
Was studierst du, wenn ich mal fragen darf?
Anmerkungen zum Code:
Grmpf, du versuchst zwei Dinge gleichzeitig was nicht geht. Baue zuerst deine Dateien für den Umgang mit komplexen Zahlen und danach führe erst die Berechnung.... tComplex MyH(double w) { tComplex R, Y, u2, u1; R = Complex_Init(470, 0); Y = Complex_Init(0, w*(...)); u2 = Complex_Mul(R, y); u1 = Complex_Mul(R, y); u1.Re++; return Complex_Div(u2, u1); }
Es ist nicht schwer. Man muss nur wollen.
-
Hehe, ja der Ehrgeiz steigt, da mich ungelöste Probleme nerven^^
Ich hab jetz was nahe am Pseudo Code angelehnt geschrieben. Programm geht schon mal ohne Fehler, allerdings bekomm ich jetz noch Null als Werte, was ja auch nicht stimmt. Wenn ich Einzelschritte mache, sehe ich dass u1 und u2 brav berechnet werden. Wie bekomm ich also Die Werte aus meiner Funktion in die main,damit ich sie ausgeben kann?
#include <stdio.h> #include <math.h> //Vorgegebene Werte: const double C1 = 4e-12; const double C2 = 10e-12; const double L = 0.1e-3; const double R = 470; //Kreisfrequenz Omega double omega = 10; //Definition einer Komplexen Zahl struct komplexeZahl { double Re; double Im; }; //Implementieren von h als komplexe Zahl für return struct komplexeZahl h; //Implementieren von Zähler und Nenner struct komplexeZahl u1; struct komplexeZahl u2; //Funktion für Berechnung struct komplexeZahl H(double omega) { //Implementieren und berechnen von Leitwert struct komplexeZahl Y; Y.Re = 0; Y.Im = omega*(C2/(1-omega*omega*L*C2)-C1); //R*Y u2.Re = R * Y.Re; u2.Im = R * Y.Im; //1+R*Y u1.Re = 1 + u2.Re; u1.Im = u2.Im; return h; } int main (void){ printf("%e,%e", H(10).Re, H(10).Im); getchar(); return 0; }
P.S.: Weiss grade nicht ob ich Implementieren und Definieren in ihrer richtigen Bedeutung benutzt habe, aber grad gings nur darum zu wissen was gemacht wird. Um die Richtigkeit der Kommentare kümmere ich mich am Schluss.
edit: Ich studiere Mechatronik. Informatik war/ist nur ein einsemestriges Fach in dem die Grundlagen von C vermittelt werden sollen.
-
h wird in der funktion nichts zugewiesen. die division fehlt.
-
Erstens: Nimm bitte die cpp tags, wenn du c Code postest.
Zweitens: Lies doch mal die Vorlesungsunterlagen / ein Tutorial über die Gültigkeitsbereiche von Variablen. Du hast ein h das du nie brauchst und das global ist, welches von deiner Funktion zurück gegeben wird. Das kann nicht funktionierten.
Ein kleiner fix (du solltest das aber besser richtig implementieren, anstatt mit all diesen globalen Variablen):
H(10); printf("%e,%e", u1.Re, u1.Im);
-
Danke für die schnellen Antworten. Hab die Division eingefügt. Versucht so wenig wie möglich globale Variablen zu benutzen und erst H(10) und dann ausgegben. Ein Problem hab ich noch, weswegen ich vorher h als globale Variable hatte.
#include <stdio.h> #include <math.h> //Vorgegebene Werte: const double C1 = 4e-12; const double C2 = 10e-12; const double L = 0.1e-3; const double R = 470; //Kreisfrequenz Omega double omega //Definition einer Komplexen Zahl struct komplexeZahl { double Re; double Im; }; struct komplexeZahl H(double omega); int main (void){ H(10); printf("%e,%e", h.Re, h.Im); getchar(); return 0; } //Funktion für Berechnung struct komplexeZahl H(double omega) { //Implementieren und berechnen von Leitwert struct komplexeZahl Y; Y.Re = 0; Y.Im = omega*(C2/(1-omega*omega*L*C2)-C1); //Implementieren von Zähler und Nenner struct komplexeZahl u1; struct komplexeZahl u2; //R*Y u2.Re = R * Y.Re; u2.Im = R * Y.Im; //1+R*Y u1.Re = 1 + u2.Re; u1.Im = u2.Im; //Die Division struct komplexeZahl h; h.Re = (u2.Re * u1.Re - u2.Im * u1.Im) / (u1.Im * u1.Im + u2.Im * u2.Im); h.Im = (u2.Re * u1.Im - u2.Im * u1.Re) / (u1.Im * u1.Im + u2.Im * u2.Im); return h; }
Der Compiler meckert noch, dass h (bei printf) "Der Bezeichner ""h"" ist nicht definiert.
Mit der Fehlermeldung kann ich nun gar nichts anfangen. Ich hab h implementiert, h.Im und h.Re definiert und return gemacht...
-
Du gibst zwar h zurück, aber du ignorierst es...
struct komplexeZahl h; h=H(10); printf("%e,%e", h.Re, h.Im);
-
Ich blicks nicht. Sorry
In der Funktion
struct komplexeZahl H (double omega);
implementiere ich ganz unten h. Dann definiere ich Re und Im durch die Division und dann mach ich damit einen Return. In der Main lass ich H(10) durchlaufen. Somit sollte doch dann in der funktion h berechnet und returned werden. in der print möchte ich dann h anzeigen. Somit habe ich h doch nicht ignoriert.
Selbst wenn ichs so mach wie du sagst, gehts nicht -.-
Es gibt 2 Probleme.
1. So wie es in meinem Code steht: Bezeichnerproblem mit h.
2. So wie du es gesagt hast und in meinem: 'return': 'int' kann nicht in 'komplexeZahl' konvertiert werden
Steh ich denn so dermaßen auf der Leitung??
-
Du musst einfach mal dringend etwas über Scopes, Parameter und Rückgabewerte lesen.
Der Bezeichner h ist nur lokal in der Funktion verfügbar. Darauf hast Du in main nicht auf magische Weise Zugriff. Der Rückgabewert der Funktion muss einfach wieder in einer anderen Variablen gespeichert werden, so wie lustig gezeigt hat. Deren Name ist dann vollkommen egal.
-
Keine Ahnung wie du da
'int' kann nicht in 'komplexeZahl' konvertiert werden
bekommst. Bei mir funktionierts mit den Zeilen die ich oben geschrieben habe (also zumindest kompilierts und es kommt was raus, ob die Werte stimmen musst du selbst beurteilen):
-
Danke, also des Problem glaub ich liegt grad am Compiler...i probiers mal mit nem anderen...
-
Sodala, also mit nem anderem Compiler gehts nun bei mir auch. Ich hab nun folgendes... (Amp, Phase sind ausgerechnet) Umrechnung in dB für Grafik erst mal noch Nebensache, da ich des erst die Sache mit der Grafik kapieren muss
#include <stdio.h> #include <math.h> //Vorgegebene Werte: const double C1 = 4e-12; const double C2 = 10e-12; const double L = 0.1e-3; const double R = 470; //Implementieren von Omega double omega; //Definition einer Komplexen Zahl struct komplexeZahl { double Re; double Im; }; //Funktionsprototypen struct komplexeZahl H(double omega); double Amplitude (struct komplexeZahl h); double Winkel (struct komplexeZahl h); int main (void){ struct komplexeZahl h; for (omega = 4.5e6; omega < 4.5e6 + 70 * 20e3; omega = omega + 20e3) { h = H(omega); double Amp = Amplitude(h); double Pha = Winkel(h); printf("%lf\n", Amp); } getchar(); return 0; } //Funktion für Berechnung struct komplexeZahl H(double omega) { //Implementieren und berechnen von Leitwert struct komplexeZahl Y; Y.Re = 0; Y.Im = omega*(C2/(1-omega*omega*L*C2)-C1); //Implementieren von Zähler und Nenner struct komplexeZahl u1,u2; //R*Y u2.Re = R * Y.Re; u2.Im = R * Y.Im; //1+R*Y u1.Re = 1 + u2.Re; u1.Im = u2.Im; //Die Division struct komplexeZahl h; h.Re = (u2.Re * u1.Re - u2.Im * u1.Im) / (u1.Im * u1.Im + u2.Im * u2.Im); h.Im = (u2.Re * u1.Im - u2.Im * u1.Re) / (u1.Im * u1.Im + u2.Im * u2.Im); return h; } //Funktion zum Berechnen der Amplitude double Amplitude (struct komplexeZahl h) { double Amp = sqrt((h.Im * h.Im) / (h.Re * h.Re)); return Amp; } //Funktion zum Berechnen des Winkels double Winkel (struct komplexeZahl h) { double Pha = atan2(h.Im, h.Re); return Pha; }
Jetzt soll ich das Ganze als 'Pseudo' Grafik darstellen:
http://s1.directupload.net/images/111213/temp/bybewc5y.jpg
Liege ich richtig in der Annahme, dass das in C nur über Schleifen und printf zu realisieren ist. Würde mich sehr freuen wenn ihr mir wieder helfen könntet. Ich mach mich morgen an meinen eigenen Ansatz, sollte ich eine zündende Idee haben, ansonsten bin ich wieder auf Euch angewiesen.
So long... vielen Dank bisher und im Vorraus.
scontch