Laminatberechnung C++

  • Themenstarter Themenstarter selvita
  • Beginndatum Beginndatum
S

selvita

Hallo Ihr Lieben,

ich freu mich erstmal das ich euch gefunden hab :)

Ich programmiere zZ ein Berechnung für Laminatbeschädigungen in C++.
Das sind 10 Rechenschritte die ich durchgehen muss und hängen tu ich bereits an dem 2.

Dazu muss ich sagen das ich selber keine gute Programmiererin bin aber ich es trotzdem irgendwie hinkriegen muss :(

mein Frage nun ich muss nun eine Matrixpultiplikation durchführen mit einer festen Matrix, sprich ich brauch keine Eingabewerte!

Ich habe 3 Matrizen in 3x3 Form, und 2 davon sind mit cos und sin aufgebaut.

ich bin erstmal so an die aufgabe rangegangen das ich die einzelnen koeffizienten der matrix festgelegt hab:

double Transformation;
double a1=cos²;
double a2=sin²;
double a3=2*sin*cos -> das sind ist die 1. Zeile der 1. 3x3 Matrix.

Bevor ich weiter poste, würde ich mich freuen wenn mir einer sagen könnte wieso ich eine Fehlermeldung bekomm wie
\include\math.h:kann 'long double cos(long double)' sein .......

wieso erkennt der das so nicht wie soll ich das denn sonst schreiben,
weil mein nächster schritt wäre dann das ich die variablen der neuen matrix(ergebnis) festlege indem ich zb. -> a1*wert2. 3x3MatrixQ11+ a2*wert 2. 3x3MatrixQ21 usw.... laut Matrixmulttplikation dann halt.


Leute ich bin totaaaal verzweifeltm, hier auf der arbeit kann keiner c++ sondern nur python :(
ich weiss das man es eigentlich mit arrays macht aber ist es nötig wenn die matrizen eh fest sind?
wie ihr seht kann ich eigentlich kaum programmieren werdet ihr jetzt bestimmt denken :D aber no chance ich muss da jetzt durch.

Ich hoffe das ihr mir tipps geben könnt
 
Wenn du C++ verwenden kannst und nicht an C gebunden bist, dann kannst du dir ja eine nette Klasse zusammenbasteln, ich hab hier mal so auf die Schnelle was versucht:
http://pastebin.com/jjU0TWQS

Das lässt dann auch folgende einfache Verwendung zu:
Code:
	Matrix<> mat;

	mat[0][0] = 1.0f;
	mat[0][1] = 0.0f;
	mat[0][2] = 0.0f;
	mat[1][0] = 0.0f;
	mat[2][0] = 0.0f;
	mat[1][1] = cosf(1.0f);
	mat[1][2] = -sinf(1.0f);
	mat[2][1] = sinf(1.0f);
	mat[2][2] = cosf(1.0f);

sin ist eine Funktion, welche in diversen Überladungen vorkommt. Da aber zum Beispiel int nicht zu den Typen gehört für die eine Überladung vorhanden ist weiss der Compiler nicht, welche Überladung genommen werden soll, da ja int grundsätzlich sowohl zu double als auch zu float konvertiert werden könnte.

Daher kannst du zum Beispiel sinf verweden, welches ausschliesslich float erwartet als Eingabe und auch float zurückgibt. Oder bei sin:
Code:
int val = 0;
sin((float)val);

Gruss
Cromon
 
Hallo und danke für die zügige antwort.


ich habe mir den code angeschaut und ehrlich gesagt ist der mir zu hoch:D

geht das denn nicht irgendwie leichter zu programmiernen ?

ich dacht da daran das ich zb meine neue koeffizienten berechne indem ich einfach:

1. Matrix
c²,s²,2sc
s²,c²,-2sc
-sc,sc,c²*-sin²

s:sinus,c:cosinus

2. Matrix
125.75,2.41,0
2.41,8.05,0
0,0,5


und der code dann in etwa so:
a11=(c²*125,75)+(s²*2,41)+(2sc*0); a12=(c²*2,41)+(s²*8,05)+(2sc*0); a13=(c²*0)+(s²*0)+(2sc*5);

usw....

aber hier ist gerade mein problem glaub ich , weil ich in c++ keine rechnung mit -> cosinus²*125,75 zb machen kann?
wie soll ich denn den code schreiben damit das gemacht wird was ich meine?


ich bitte bitte euch um hilfe, ich weiss leider nicht weiter und mein dickes Prinz und Prinz buch hilft mir auch nicht weiter :(
 
das geht schon, aber der compiler wird vermutlich ein "²" nicht verstehen. Aber das ist ja leicht zu beheben, indem man z.B. c*c schreibt =)
 
Bin zwar net so gut in Mathe aber folgendes sollte besser klappen:

Code:
a11=(c*c*125.75f)+(s*s*2.41f)+(2*s*c*0);
a12=(c*c*2.41f)+(s*s*8.05f)+(2*s*c*0);
a13=(c*c*0)+(s*s*0)+(2*s*c*5);

btw. wie bereits gesagt, kein guter Mathematiker, aber würde bei 2*s*c*0 nicht 0 rauskommen, ggf. sagt dir das sogar dein Compiler und weigert sich das zu Compelieren (wobei ich da nichtmal sicher bin, evtl. gibts auch nur einen Laufzeitfehler)?

mfg
Valkyri

PS: Kurz als erklärung
C++ nutzt normalerweise die Englische Mathematik, wo "Kommawerte" mit einem "." (Punkt) getrennt werden, desweiteren verstehen die meisten Compiler wie bereits von kickerxy123 angemerkt kein "²" oder "³", was wiederum dazu führt das man ihm das einfacher sagen muss (c*c) und es schaded nie hinter einer float auch ein "f" für float zu packen, auch wenn es ohne funktionieren würde!
 
Zuletzt bearbeitet:
Zurück