Laden...

Formel als eigenschaft

Erstellt von Nopileos vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.305 Views
N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren
Formel als eigenschaft

Ich will verschiedene Physikalische Einheiten in Form eines Objektes darstellen. eine Eigenschaft dieses Objekt soll die "Herleitung" sein die soll jedoch nicht nur aus einem string bestehen da der Computer die Einheiten später auch um rechnen können soll zu Beispiel aus Leistung und Strom die Spannung errechnen. Hat da jemand eine Idee / einen Ansatz?


struct Wert // bsp. 100 Amper
{
 Einheit typ; // Amper
 decimal Value; // 100
}

struct Einheit // Amper
{
 string Name; // "Amper"
 Messbereich Art; // Strom
 string Einheitenzeichen; // "A"
 // 1 Amper = 1 Amper  Irgentwie den zusammen hang zu den SI-Basiseinheiten "Computer lesbar" darstellen
}

struct Messbereich // Strom
{
 char Formellzeichen; // 'I'
string Beschreibung;  // "Der Strom ist eine Einheit im bereich der Elektronik" 
 // wird noch erweitert
}

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann

4.221 Beiträge seit 2005
vor 17 Jahren

Tipp:

Mach es nicht als struct sondern als Klasse

ValueType contra ReferenceType

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Original von Programmierhans

ValueType contra ReferenceType

Ganz so einfach ist das nicht (leider) beispielsweise von grad Fahrenheit auf grad Kelvin °K = (°F - 32) / 1.8 - 273,15

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann

Q
214 Beiträge seit 2006
vor 17 Jahren

Hallo,
hmm eine Möglichkeit wäre eine Überladung von Rechenoperatoren in den Klassen.

Bsp:
Power p = U * I;

Dann musst du in der Klasse Spannung den Operator * überladen, so dass dieser als Eingang einmal Spannung und einmal Stromstärke erwartet und als Rückgabe den Wert Power/Watt hat.

Und bei der Klasse Widerstand kannst du z.B. den * so überladen, dass er Ohm und Stromstärke erwartet (U=R*I) usw.

Dann wäre so eine Formel Problemlos möglich:
Power p = RII;

Das R*I würde zu Spannung werden und dann zu Power/Watt.

Und die Umwandlung von Messeinheiten kannst du ja auch überladen. Du kannst in der Klasse Kelvin das casting für Fahrenheit=>Kelvin überladen sowie das casting von Celsius=>Kelvin.
So dass man es dann so schreiben kann:
Kelvin k = new Fahrenheit(83);

Sofern man in Kelvin das implizierte casten überladen hat.

Ich hoffe es war soweit verständlich.

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Original von Qwald
Und die Umwandlung von Messeinheiten kannst du ja auch überladen. Du kannst in der Klasse Kelvin das casting für Fahrenheit=>Kelvin überladen sowie das casting von Celsius=>Kelvin.
So dass man es dann so schreiben kann:
Kelvin k = new Fahrenheit(83);

Sofern man in Kelvin das implizierte casten überladen hat.

Ich hoffe es war soweit verständlich.

Nur Es sollen unter Umständen auch während der Laufzeit neue Messeinheiten dazu kommen. Und wenn ich daran denke wieviel Einheiten und Konstanten es gibt wird mir schummerig wenn ich für jede ne neue klasse schreiben muss. ~~~

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann

B
1.529 Beiträge seit 2006
vor 17 Jahren
  1. Sorry, wenn ich dass sage, aber wenn du Ampère nicht richtig schreiben kannst und von Grad Kelvin redest, sehe ich von physikalischer Seite schwarz.

  2. Um das ganze auf ein halbwegs sinnvolle Grundlage zu stellen, würde ich nicht die Einheiten sondern die physikalischen Größen per Klasse erfassen.
    Also hättest du dann Klassen wie Weg, Masse, Zeit, elektrische Stromstärke, Temperatur, Stoffmenge und Lichtstärke, die intern ausschließlich die SI Grundeinheiten verwenden.
    Die Klasse würde dann Methoden zur Umrechnung anbieten. Wenn du also eine Instanz von Temperatur mit dem Wert 1000 (laut SI also 1000 Kelvin) hast, bietet diese ein Methode namens InCelsius an, welche in diesem Fall 726.85 liefern würde.

  3. Dennoch, wird dies allein nicht sehr sinnvoll werden, wenn du dem Computer die Unterscheidung zwischen Einheiten nahe bringen willst. Das eigentliche Problem stellt ja nicht die Klassenstruktur dar (auch wenn ich nicht glaube, dass es sinnvoll ist, dafür eine Struktur zu erstellen). Das Problem ist vielmehr, dass du dem Computer die sinnvollen Verknüpfungen zwischen beispielsweise Weg s und Zeit t darlegen musst. Davon gibt es aber mehrere (Länge s, Fläche s², Volumen s³, Geschwindigkeit s/t, Beschleunigung s/t²). Daher macht es in meinen Augen nur Sinn, dass auf die mathematische Grundlage zu stellen. Also Geschwindigkeit v = ds/dt u.ä. Um also physikalische Beziehungen sinnvoll darstellen zu können, müsstest du erstmal mathematische Beziehungen erfassen und darstellen können. Schließlich stellen die physikalischen eine Untermenge der mathematischen dar.

  4. Wenn es dir nur um Umrechnung zwischen den Einheiten geht, benötigst du diese ganzen Strukturen nicht, das ist relativ problemlos möglich.

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

zu 3 aber das problem ist wie soll ich die Formel dem komputer klar machen wenn da " Beschleunigung = Strecke / Zeit² " als String steht wird mein PC da unheimlich viel mit anfangen können ironie

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann

B
1.529 Beiträge seit 2006
vor 17 Jahren

Das sagte ich doch. Dein Computer muss mathematische Strukturen erfassen, d.h. parsen können.
Hast du einen solchen Parser, könntest du beispielsweise schreiben:

# die Raute ist Kommentar; mit => sind die Antworten des Systems gekennzeichnet
# Weg
DEFINE ENTITY s CALL "Weg"
DEFINE UNIT "m" AS s CALL "Meter"
DEFINE UNIT "km" AS s WHERE [km]=[m]/1000 CALL "Kilometer"
# Zeit
DEFINE ENTITY t CALL "Zeit"
DEFINE UNIT "s" AS t CALL "Sekunde"
DEFINE UNIT "min" AS t WHERE [min]=[s]/60 CALL "Minute"
DEFINE RELATION s(t) CALL "Weg nach Zeit"
# Geschwindigkeit
DEFINE ENTITY v CALL "Geschwindigkeit"
DEFINE RELATION v(t)=s'(t) CALL "Geschwindigkeit nach Zeit"
# Beschleunigung 
DEFINE ENTITY a CALL "Beschleunigung"
DEFINE RELATION a(t)=v'(t) CALL "Beschleunigung nach Zeit"

# beschl. Bewegung: s = a/2*t²
SET meinSturz AS s(t)=9.81/2*t*t
=> meinSturz:s(t)=9.81/2*t*t

CALC meinSturz(5) 
=> 122.625 m
CALC meinSturz(5) IN "km"
=> 0.122625 km

SET meineGeschw AS v(t) FROM meinSturz
=> meineGeschw:v(t)= meinSturz:s'(t) = 9.81*t
CALC meineGeschw(10)
=> 98.1 m/s

SET meineBeschl AS a(t) FROM meinSturz
=> meineBeschl:a(t) = meinSturz:v'(t) = meinSturz:s''(t) = 9.81
CALC meineBeschl(17)
=> 9.81 m/s²
CALS meineBeschl(17) IN "s:km;t:min"
=> 35,316 km/min²

Das Beispiel ist jetzt zwar etwas umfangreicher geworden, aber ich hoffe, es macht deutlich, wie ich das meinte. Du benötigst also zuerst mal eine Syntax, dann einen Parser dafür. Dieser generiert ein Netz mit Beziehungen zwischen verschiedenen Entitäten. Parameter dieser Beziehungen sind die Operationen, welche du natürlich auch kennen musst.
Das bedeutet, in deinem Code gibt es gar keine Klassen, die den verschiedenen physikalischen Größen entsprechen, sondern nur eine Entitäten-Klasse und eine Beziehung-Klasse. Die Logik kommt durch die Verknüpfungen von Entitäten und Beziehungen zustande.

EDIT*: Beispiel überarbeitet.

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Ich Hatte nie vor für alle physikalischen Größen eine eigene Klasse zu schreiben, das war Qwald s idee. Und danke für den Code ich wert den mal dur arbeiten.

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Gut das war mir alles klar nur wie schaffe ich es das wenn beispielsweise ein string ist indem steht "V = L³" auf die funktiopn ³ zukommen? das heist gibts irgentwie ein funktion in .net wie "Ausrechnen decimal ( string Aufgabe, decimal Verwendetevariabel1 , decimal Verwendetevariable2 ...)" ?

Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann