An die Chemiker....Und Programmierer



  • Also zunächst würde ich die wissenschaftliche Literatur per EDV-Recherche sichten. Dann kannst Du Dir vielleicht die Diplomarbeit beschaffen, von der ich Dir den Link gegeben habe (den Author einfach höflich anschreiben, vielleicht kann er Dir auch weitere Tipps geben).

    Ich finde das Thema nicht uninteressant, aber man sollte es am Anfang auf ein ganz kleines Gebiet beschränken. Chemische Reaktionen sind durch Enthalpie und Entropie gesteuert. Du musst daher die gesamten Bindungsenergien eingeben. In der organischen Chemie hat man dann noch die ganzen I- und M-Effekte, sterische Effekte etc. Vierringe bilden sich z.B. sehr schwer. Denke auch mal an Polymerisation oder Katalyse. Das ist ein schwieriges Thema.

    Eine grundsätzliche Lösung gibt es nicht, denn sonst müssten wir in unserer Firma nicht soviel Geld für "echte" chemische Forschung ausgeben. Ich weiß nur, dass Wirkstoffchemiker mit räumlichen Programmen arbeiten, um Moleküle nach sterischen Effekten (Schlüssel-Schloss-Prinzip) zu optimieren.

    Das ist aber etwas anderes, als das, was Du willst.

    Nehmen wir ein konkretes Beispiel, das das Programm lösen muss:
    H2 + O2 --> ? Da könnte H2O, H2O2 und O3 resultieren. Das hängt ganz von den Bedingungen ab.

    oder: S + O2 <--> SO2 und SO2 + 1/2 O2 <--> SO3

    Ich würde mit solch einfachen Beispielen beginnen.



  • Hi

    @erhard

    Ich werde das mit der Diplomarbeit angehen.
    Ich hab ja bereits geschrieben dass, das ganze nur eingeschränkt funktioniert.
    Das Problem mit den induktiven Effekten hab ich auch gesehen. Bin aber noch zu keiner zufriedenstellenden lösung gekommen. Ich denke ich werde mich auf einige wenige gut bekannte Reaktionsmechanismen beschränken(zunächst).
    Und da gibt es zu mindest in der Organik schon ein paar Sachen die man machen kann. Es gibt ja zum Glück einige einfache Faustregeln für mesomerie effekte und induktive effekte und wie sie sich auswirken. Ich denke das kann ich für meine Zwecke ausreichend beachten.
    Sehr viel schwieriger wird es bei der Sterik. Ich müsste zusätzlich Bindungslängen, Bindungswinkel und Atomradien beachten. Mal ganz angesehen davon das sich Moleküle in Bewegung befinden. Aber ich denke da helfen statistische Methoden weiter.

    Ich werde mich jetz erstmal um die Diplomarbeit kümmern, und mir dann um die Repräsentation gedanken machen.

    Ich denke bei entsprechenden Parametern kann man gute Aussagen über die Reaktionen treffen. Ich mache das von Hand auch nicht anders.

    Zum Glück gibt es riesige Tabellenbücher. Was mich zum Problem der Datenspeicherung bringt. Ich habe an xml oder Datenbanken gedacht. Was meint ihr ?



  • Original erstellt von prolog:
    **@spieleprogrammier

    So ähnlich ist meine Idee ja gewesen.
    Ich hab nur das Problem das im Prinzip dem Programm gesagt werden muss wie es solche Verbindungen aufbaut. ;)**

    Na dann nimm eine Klasse, und lass dann die Eigenschaften vererben, zur Laufzeit meine ich, wäre zumindest am einfachsten.

    Also:

    class Atome
    {
      public:
        int p;
        int e;
        int n;
    }
    
    // [...] \\
    
    class Wasserstoff::Atome.public //Vererbung?
    {
      public:
        string Name="Wasserstoff";
      private:
        char Bezeichnung='H';
    }
    
    // [...] \\
    
    Wasserstoff.p=1;
    Wasserstoff.e=1;
    Wasserstoff.n=0;
    

    [ Dieser Beitrag wurde am 25.06.2003 um 10:23 Uhr von Spieleprogrammierer editiert. ]



  • @Spieleprogrammierer: das ist hier ungeschickt. Wasserstoff erbt nicht von Atom! Wasserstoff ist eine Komposition von Atomen, d.h. enthält entsprechende Memberobjekte.



  • Naja, was weiß ich, dann formt ihr des halt um.

    [ Dieser Beitrag wurde am 25.06.2003 um 14:20 Uhr von Spieleprogrammierer editiert. ]



  • Aus welcher Programmiersprache stammt dein Code ? :p



  • Meiner? -C++, kann sein, dass

    class Wasserstoff::Atome.public

    falsch ist, vielleicht wirds ja anders formuliert, hab ich noch nicht gemacht, aber ich weiß, dass das Vererbung ist.



  • Aus welcher Programmiersprache stammt dein Code
    Pseudo.

    Gibts für soetwas eigentlich einen Compiler?

    [ Dieser Beitrag wurde am 25.06.2003 um 14:50 Uhr von echter Troll editiert. ]



  • Hi

    @spieleprogrammierer

    Also es wär mir neu das man zur Laufzeit vererben kann.
    Nimm das jetz nicht als Flame.

    du meintest bestimmt.

    class Abgeleitet : public Basisklasse
    {
    }



  • @Spieleprogrammier: Es ist echt kein Flame, soll eher flames von dir fernhalten. Poste nicht zu Themen bei denen du dir nicht sicher bist das du sie komplett verstanden hast. Und wenn du trotzdem helfen willst, dann schreib in Pseudo-Code (falls du diese Programmierkenntnisse noch nicht hast) oder schreib einfach dahinter das du keine Ahnung hast, aber das das deiner Meinung nach der beste Weg wäre.
    Und noch ne kleine Frage, hast du schon Chemie?

    Ok, kleiner abstecher für dich, prolog will Reaktionen simulieren.
    Das heisst er prellt ne bestimmte stoffmenge X, rein eine Bestimmte Menge Y und noch n andere Mengen.
    Nehmen wir an er mischt, K(Kalium), H(Wasserstoff),O(Sauerstoff) und Cl(Clor)..
    Dann muss das Programm schonmal wissen das Gase immer Bi-Atomar vorkommen.
    Also:
    K+H2+O2+Cl2
    Jetzt überprüft das programm die verschiedenen Stats der Atome zu ermitteln!
    Fangen wir mit Clor an. Wie du vielleicht weisst, hat Clor 7 Valenzelektronen und will aber 8 ve.
    Also versucht es sich welche zu holen.
    Es gibt also die Produkte HCl, KCl und vielleicht sogar O6CL (glaub nicht das das Molekül existiert. Aber vielleicht ja...)
    Ok, jetzt sagen wir ist das komplette Cl aufgebraucht. Aber noch etwas O2,H2,und K ist da..
    O2 reagiert mit H2 zu Wasser (H2O) oder zu Wasserperoxid(H2O2) und mit Kalium zu DiKalium-oxid (K2O) und vielleicht auch hier zu DiKaliumDiOxid(K2O2)
    Das heisst eine mögliche Gleichung wäre:
    K+H2+O2+Cl2 reagiert zu -> HCl + KCl + O6Cl + H2O2 + H2O + K2O + K2O2

    Und das muss man dem Programm rechnerisch beibringen. Es ist also ein ganz schön großes Problem.



  • Wasserstoff.p=1; // Proton
    Wasserstoff.e=1; // Elektron
    Wasserstoff.n=0; // Neutron

    In der Form handelt es sich um ein einzelnes H-Atom. Daher ist Wasserstoff hier ein Atom.

    Eine Komposition zweier H-Atome ergibt dann ein Wasserstoffmolekül.

    Daher würde ich für erste Versuche eine Klasse Atom und eine Klasse Molekül schaffen. Die Klasse Atom sollte alle für die Chemie wichtigen Attribute haben, die ein Atom auszeichnet.

    Wie stellst Du Dir die Klasse Molekül vor?



  • @stealth00: O6Cl ? junge, junge ..., da solltest Du noch einmal drüber nachdenken.

    Bei der oben skizzierten Reaktion spielt die Elektronegativität eine große Rolle. Daher wird sich zunächst KCl unter "Feuererscheinung" bilden. Dabei verbrennt dann auch Wasserstoff mit Sauerstoff, wahrscheinlich explosionsartig (Knallgas). Aus Wasserstoff und Chlor entsteht Chlorwasserstoff, der dann mit dem gebildeten Wasser dissoziativ zu Salzsäure (ionisierter Chlorwasserstoff) reagiert. Lustige Reaktion.



  • HI

    Okey, soweit war ich schon.
    Ich hab bei einfachen Molekülen an ein Array bzw. an einen vector von Atomen
    gedacht. Jetz ergibt sich nur bei der Bindung folgendes Problem.

    Bei einer kovalenten Bindung verändert sich das Attribut Elektronen dahingehend das entweder welche dazu kommen, oder aber abgegeben werden.
    Sie werden aber nicht wirklich abgegeben. Es ist halt ein Mittelding.
    Wie sage ich also dass,das Atom jetz nicht mehr (nehmen wir die Halogene)
    7 Aussenelektronen besitz sondern 8. Aber das stimmt ja auch nur begrenzt.
    Ich kann ja nicht formal jedem der beiden Reaktionspartner ein Elektron klauen bzw. schenken. Sie werden ja nicht komplett abgegeben. Damit hab ich noch schwierigkeiten. Ich hab da einen Ansatz aus der Fuzzylogik. Ich könnte einfach sagen, dass das besagte Atom mit Sicherheit 1.2 oder so 8e- hat.

    Bei Ionenbindungen zB.: ergibt sich eigentlich nur das Problem, dass man dann nicht mehr von Atomen sprechen kann, weil eben Ionen, also müssten die auch eingeführt werden.

    Ein anderer Ansatz ist die Benutzung einer Klasse Molekülorbital, auf das jedes beteiligte Atom einen Zeiger bekommt, weils ja zu beiden gehört.

    Also so waren bis jetz meine Ideen.



  • HI

    Also ich hab hier mal nen ersten Entwurf für ne Atomklasse.

    class MO;
    
    class Atom
    {
       protected:
         char bonds;
         char valenz;
         short e;
         mutable short p;
         mutable short n;
         mutable float en;
         //evtl. größe relativ oder absolut
         float masse;
         //evtl. Elektronenaffinität
         //evtl. Ionisierungsenthalpien
         //evtl. Elektronenkonfiguration
         MO *mo;
      public:
        Atom(short p,short e,short n,float en,float m,char v);
        ~Atom();
       virtual bool Bind(Atom &); //hier bin ich mir nicht sicher
       //und member methoden folgen
    };
    
    //Die versch. Atome werden abgeleitet
    

    Das ist noch recht einfach gehalten.



  • Original erstellt von stealth00:
    hast du schon Chemie?

    Kein Kommentar.

    Edit: Bei Flames solltest du nochmal nachdenken, wer von uns die ganze zeit flames schreibt.

    [ Dieser Beitrag wurde am 25.06.2003 um 22:55 Uhr von Spieleprogrammierer editiert. ]



  • Ich hab dich bisher noch nicht geflamt! Lediglich ein Tipp gegeben wie du die besser Flames vom Hals halten kannst.

    @EH:
    Soweit ich weiss kann Clor mindestens ein Elektron dem Sauerstoff entziehen. Wie verhält es sich nochmal wenn mehrere Elektronen entzogen werden? Ich glaube die Energie, die zum lösen eines weiteren Elektronen benötigt werden, steigt nach und nach an. Oder lieg ich da falsch
    zum O6Cl molekül, upss, meinte eigentlich OCL6 molekül da ja O 6 valent elektronen besitzt. Hab aber ja dazu geschrieben das ich das für unrealistisch halte, da ja wie oben schon gesagt die Menge der benötigten Energie steigt.
    Hab halt kein Chemie studiert wie du 😃

    Noch se ne kleine Off-Topic frage:
    Es heisst ja e=mc^2 -> e=kg*(m^2/s²) ein kg=n0,9xxx das wären dann
    Nm2s2
    0,9xxx?
    Stimmt das? Dann wären das doch am ende Joule bei e..
    Photonen sind ja (wie du sagtest) e=h*f
    h ist eine Konstante, f die Frequenz. Du hast irgendwo geschrieben das Gammastrahlung im GHz frequenz bereich liegt. In welchem Frequenz bereich liegen den "sichtbare" Photonen? (die das Auge wahrnimmt)

    /edit:
    Hmm, O mit einer 6fachen minusladung erscheint mir doch ein bisschen hoch..
    Kann man sowas überhaupt machen. Ich denke nur mit Fluor und Atomen aus der 3-5 Periode oder? (so ein Atom mit 50-60 elektronen gibt doch sicher mal 6 ab oder?)

    [ Dieser Beitrag wurde am 26.06.2003 um 00:25 Uhr von stealth00 editiert. ]



  • Original erstellt von prolog:
    **HI

    Also ich hab hier mal nen ersten Entwurf für ne Atomklasse.

    class MO;
    
    class Atom
    {
       protected:
         char bonds;
         char valenz;
         short e;
         mutable short p;
         mutable short n;
         mutable float en;
         //evtl. größe relativ oder absolut
         float masse;
         //evtl. Elektronenaffinität
         //evtl. Ionisierungsenthalpien
         //evtl. Elektronenkonfiguration
         MO *mo;
      public:
        Atom(short p,short e,short n,float en,float m,char v);
        ~Atom();
       virtual bool Bind(Atom &); //hier bin ich mir nicht sicher
       //und member methoden folgen
    };
    
    //Die versch. Atome werden abgeleitet
    

    Das ist noch recht einfach gehalten.**

    du brauchst keine Valenz elektronen. Gib einfach die kompletten Elektronen an und dann kannst du die Elektronen per e=n^2*2 ausrechen.
    e sind die elektronen, n die Schalen. bei 2 Schalen ist die Maximale anzahl der Elektonen 10 (8 in der L schale, 2 in der K schale) 2^2*2=8 (L schale) + 1^2*2=2 (in der K Schale)..
    Was vielleicht noch notwendig ist, ist eine Formel mit der du die Energie berechnest für alle weiteren Elektronen (siehe Post weiter oben)

    Falls ich hier mist erzähle, EH, bitte net gleich hauen 😉

    /Edit ich würde die Atome übrigens nicht Hard-Coden sondern lieber per Script (lua oder so) laden!
    Ist einfacher handzuhaben oder?

    [ Dieser Beitrag wurde am 26.06.2003 um 00:28 Uhr von stealth00 editiert. ]



  • HI

    @Valenz elektronen

    Ich hab die deshalb hardgecoded damit sie nicht immer erst berechnet werden müssen.

    Ich hab mir inzwischen auch ein paar gedanken zu Molekülen gemacht.
    Bei einfachen Verbindungen zB.: aus zwei Atomen nehme ich wol einen Vector, ich denke mal das ist auch recht intuitiv.

    Obwohl ich mir darüber eigentlich noch keine Gedanken wollte, hab ich auch schon mal über cyclische Moleküle nahgedacht. Ich hab da an verkettete Ringe gedacht. Dabei ist mir wie sollst auch anders sein wieder ein Problem aufgefallen. Es ist ja möglich das aliphaten sich zu ringen umlagern(sig Kohlenhydrate). Und noch viel schlimmer die meisten Kohlenhydrate haben nicht mal ne feste Struktur, die könne doch mutarotieren. Dadurch ist die konfiguration des Anomers nicht eindeutige bestimmt.



  • Original erstellt von stealth00:
    **
    @EH:
    Soweit ich weiss kann Clor mindestens ein Elektron dem Sauerstoff entziehen. Wie verhält es sich nochmal wenn mehrere Elektronen entzogen werden? Ich glaube die Energie, die zum lösen eines weiteren Elektronen benötigt werden, steigt nach und nach an. Oder lieg ich da falsch
    zum O6Cl molekül, upss, meinte eigentlich OCL6 molekül da ja O 6 valent elektronen besitzt. Hab aber ja dazu geschrieben das ich das für unrealistisch halte, da ja wie oben schon gesagt die Menge der benötigten Energie steigt.
    Hab halt kein Chemie studiert wie du 😃

    Noch se ne kleine Off-Topic frage:
    Es heisst ja e=mc^2 -> e=kg*(m^2/s²) ein kg=n0,9xxx das wären dann
    Nm2s2
    0,9xxx?
    Stimmt das? Dann wären das doch am ende Joule bei e..
    Photonen sind ja (wie du sagtest) e=h*f
    h ist eine Konstante, f die Frequenz. Du hast irgendwo geschrieben das Gammastrahlung im GHz frequenz bereich liegt. In welchem Frequenz bereich liegen den "sichtbare" Photonen? (die das Auge wahrnimmt)

    /edit:
    [ Dieser Beitrag wurde am 26.06.2003 um 00:25 Uhr von [qb]stealth00** editiert. ][/QB]

    Wie du ja selbst gesagt hast besitz O 6 Aussenelektronen. Deshalb ist es 2 wertig.(gut es kann theoretisch von 1-6, alles sein) Kann also nicht 6 e- aufnehmen. Deshalb wird es mit OCl6 schwierig.

    Zur frequenz Wellenlänge und Frequenz stehen über die Lichtgeschwindigkeit in direktem Zusammenhang.
    f=c/wellenlänge

    Der sichtbare Bereich liegt bei 400-700 nm ca.
    Kannst es also ausrechnen.



  • Bin wie gesagt kein Chemiker, aber manchmal ne wandelnde Informationsquelle 😉

    Noch ein wenig zu Automaten:
    Die Idee der Automaten kommt von Stephen Wolfram, wem das nix sagt, er ist der Gründer und Entwickler von Mathematica. Er hat dazu auch Bücher geschrieben "Cellular Automata and Complexity" "A New Kind of Science" gibt noch zig Andere und nicht nur von Ihm.

    Und noch ein paar Links: http://www.santafe.edu/projects/evca/ http://www.fourmilab.ch/cellab/ http://cell-auto.com/

    Vielleicht findet ihr unter SourceForge auch noch den ein oder anderen Quellcode
    -> http://sourceforge.net/softwaremap/trove_list.php?form_cat=384

    Datenreduktion:
    Aus meiner Sicht ist die Nutzung einer übergeordneten Instanz besser, denn so müßten auch nur die Moleküle in die Berechnungs Matrix einbezogen werden, die sich von ihrer Nähe beeinflußen würden, alle anderen bewegen sich weiterhin, sind aber 0 Werte in der Berechnung... Quasi wie eine "Collision Detection". Aus meiner physikalischen Sicht habt ihr doch wahrscheinlich später eine n-Körper Differentialgleichung, oder ?! Wie stellt ihr überhaupt den Raum dar ? Durch ein XYZ Gatter oder gibt ihr den Molekülen die Abstände zu ihren nächsten Nachbarn mit, letztere glaub ich ist die elegantere Version. Die die Einfluß aufeinander haben, besitzen Werte, alle anderen NULL. Die obere Instanz beobachtet und läßt rechnen... die Leerräume werden so nicht als Speicher benötigt !

    Winn


Anmelden zum Antworten