"Die fertigen Rechnungen können wir einlesen und in einer Tabelle sortieren. Vergleichen Sie die erhaltenen Bindungslängen für die C=O-Bindung mit dem experimentellen Wert von 1.21 Å."
"Die fertigen Rechnungen können wir einlesen und in einer Tabelle sortieren (alle Werte in Å). Vergleichen Sie die erhaltenen Bindungslängen für die C=O-Bindung mit dem experimentellen Wert von 1.21 Å."
]
},
{
...
...
@@ -169,7 +199,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.10"
"version": "3.10.13"
}
},
"nbformat": 4,
...
...
%% Cell type:markdown id: tags:
# B.CTC: DFT
In der Vorlesung haben sie den Hartree-Fock (HF)-Ansatz und die Dichtefunktionaltheorie (DFT) kennengelernt. Die Implementation als Kohn-Sham-DFT ist dem HF-Ansatz aus technischer Perspektive sehr ähnlich, weshalb jede (uns bekannte) Quantenchemie-Software beide Methoden zur Verfügung stellt.
In dieser Demonstration wollen wir uns die Ergebnisse einer Geometrieoptimierung für verschiedene Methoden genauer anschauen. Da DFT nicht systematisch verbesserbar ist, wird zu Beginn einer theoretischen Studie immer ein sogenanntes _Benchmarking_ durchgeführt, ähnlich einer Kalibration in der Analytik. Mit verschiedenen Funktionalen wird die geforderte Größe (hier Bindungslängen) einer bekannten Verbindung berechnet. Mit dem Funktional, das die experimentelle Größe am besten wiedergibt, wird dann die entsprechende Größe für eine andere Verbindung berechnet. Dieses Verfahren funktioniert umso besser, je ähnlicher sich die Referenzverbindungen und die untersuchten Verbindungen sind.
In diesem Notebook verwenden wir Formaldehyd, das hier beste Funktional könnte also zum Beispiel sehr gut für Acetaldehyd verwendet werden.
%% Cell type:code id: tags:
``` python
importsubprocessassub
importsupport
importpandasaspd
```
%% Cell type:markdown id: tags:
Als Anfangsgeometrie verwenden wir die Koordinaten in **hcho-guess.xyz**, die Sie sich in der nächsten Zelle anschauen können.
%% Cell type:code id: tags:
``` python
coords=support.XYZ(f"hcho-guess.xyz")
fig=coords.get_molecular_viewer()
fig.show()
```
%% Cell type:markdown id: tags:
%% Cell type:code id: tags:
Als Anfangsgeometrie verwenden wir die Koordinaten in **hcho-guess.xyz**, die Sie sich in der nächsten Zelle anschauen können.
Bevor wir das Benchmarking durchführen, wollen wir mit dem HF-Ansatz für verschiedene Basissätze Bindungslängen berechnen. Die drei Basissätze sind STO-3g, def2-SVP und def2-TZVP und ihre Größe nimmt in dieser Reihenfolge zu.
In der nächsten Zelle werden in einer Schleife _input files_ erzeugt und anschließend mit ORCA berechnet.
%% Cell type:code id: tags:
``` python
# Schleife über die Basissätze
forbasis_setin("sto-3g","def2-svp","def2-tzvp"):
# öffnet eine Datei, in die geschrieben wird
withopen(f"hcho-hf-{basis_set}-opt.inp","w")asf:
# schreibt in die Datei
f.write(f"""\
! RHF {basis_set} Opt
* xyzfile 0 1 hcho-guess.xyz
""")
# Ruft ORCA auf, als wäre es im Terminal ausgeführt worden
Die fertigen Rechnungen können wir einlesen und in einer Tabelle sortieren. Vergleichen Sie die erhaltenen Bindungslängen für die C=O-Bindung mit dem experimentellen Wert von 1.21 Å.
Die fertigen Rechnungen können wir einlesen und in einer Tabelle sortieren (alle Werte in Å). Vergleichen Sie die erhaltenen Bindungslängen für die C=O-Bindung mit dem experimentellen Wert von 1.21 Å.
Für HF-Berechnungen ist ersichtlich, dass die Bindungslänge für größere Basissätze als zu kurz berechnet wird. Da ein größerer Basissatz _immer_ ein besseres (oder gleich gutes) Ergebnis liefert, muss der Fehler in der Vorhersage durch den HF-Ansatz verursacht sein.
Es mag antiintuitiv erscheinen, dass die Bindungslänge mit einem angeblich schlechteren (kleineren) Basissatz scheinbar besser vorhergesagt wird. Das ist ein klassisches Beispiel für "richtig aus dem falschen Grund", ein in der Quantenchemie recht häufig auftretendes Ergebnis. Durch Fehlerausgleich werden scheinbar korrekte Größen bestimmt, und es liegt an Ihnen als Wissenschaftler, die Plausibilität dieser Größen zu beurteilen.
Im Gegensatz zur Basissatzgröße sind Dichtefunktionale nicht systematisch verbesserbar, das heißt es gibt keinen Parameter, der mathematisch beweisbar das Ergebnis verbessert. Es ist daher ein plausibles Ergebnis, dass das "anspruchsvollere" Funktional TPSSh die schlechteste Bindungslänge liefert. In diesem Fall dürfen wir uns einfach freuen, dass die Funktionale mit geringen Rechenzeiten so gute Ergebnisse liefern und diese als bevorzugte Funktionale für unsere Rechnung verbuchen.
Return cartesian coordinates of points on the edges of a cylinder.
The cylinder is defined by the line between atoms i and j, and the radius is the given value. The number of points is determined by the resolution.
Args:
center_i (int): Index of the first atom that defines the cylinder.
center_j (int): Index of the second atom that defines the cylinder.
resolution (int, optional): The number of points to be generated. Defaults to 32.
radius (float, optional): The radius of the cylinder. Defaults to 0.1.
defmake_atom_mesh(self,i:int)->go.Mesh3d:
Returns:
tuple[np.ndarray, np.ndarray, np.ndarray]: The cartesian coordinates of the points on the edges of the cylinder. The three arrays are the x, y and z coordinates of the points.
Returns a plotly figure with the molecular structure.
The molecular structure is represented as a collection of spheres at the atomic positions,
with the bonds represented as cylinders between the atoms.
Args:
resolution (int, optional): The number of points to be generated. Defaults to 64.
rel_cutoff (float, optional): Bond are only shown if the interatomic distance is smaller than the sum of the atomic vdw radii multiplied with this parameter.
Defaults to 0.5.
Returns:
go.Figure: A plotly figure with the molecular structure.