Hallo Kurt,
<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: Kurt</i>
zu 3. C- Programmierung? Hab leider noch nie etwas davon gehört. Gibt es dazu vielleicht einen frei zugänglichen Link?
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">
C# ist eine Programmiersprache, ähnlich wie C, C++ oder Java. Wobei sich Java und C# ziemlich ähnlich sind. Aber das ist nichts was man mal eben schnell so nebenbei lernt. Ich habe mit C# vor ca. 6-8 Jahren angefangen und bin inzwischen soweit dass ich fast alles hinkriege was ich programmieren möchte. Als Einstieg kann ich empfehlen einen Kurs bei der Volkshochschule zu machen. Dazu 2-3 Bücher zum Nachschlagen. Ob man Java oder C# lernt, das ist ziemlich egal. Wenn man die eine Sprache kann, dann kann man auch die andere.
Links zu C# gibt es sicher Tausende.
Um dir mal einen Eindruck zu vermitteln wie so ein Programm aussieht, füge ich hier mal den Source-Code ein mit dem das oben verlinkte Bild erzeugt wurde.
Gruß
Michael
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Globalization;
namespace CO2
{
public partial class Form1 : Form
{
double[] absorption = new double[500000]; // Index = 0.01 * (Wellenzahl in cm^-1)
double[] blackbody = new double[500000];
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
Graphics g = Graphics.FromHwnd(panel1.Handle);
SolidBrush redBrush = new SolidBrush(Color.Red);
SolidBrush greenBrush = new SolidBrush(Color.LightGreen);
SolidBrush blueBrush = new SolidBrush(Color.Blue);
SolidBrush yellowBrush = new SolidBrush(Color.Yellow);
SolidBrush blackBrush = new SolidBrush(Color.Black);
CultureInfo invC = CultureInfo.InvariantCulture;
for (int j = 0; j < 500000; j++) // Das Array wird mit einer sehr kleinen Absorption gefüllt
{ // damit sichergestellt ist dass nicht Null drin steht
absorption[j] = 1e-14;
}
double weglaenge = 8.5 * 1.5; // Weglänge in Kilometer
// Unter der vereinfachten Annahme, dass die Atmosphäre einen
// konstanten Druck von 1 atm hat, wäre die Weglänge 8.5 km.
// Da die Abstrahlung vom Erdboden aber nicht nur senkrecht nach oben erfolgt,
// sondern auch in andere Richtungen, wird mit dem Faktor multipliziert.
for (int i = 300; i <= 4900; i += 100)
{
// 47 Dateien einlesen, jede enthält ein Absorptionsspektrum mit 100 cm^-1 Bandbreite
// Die Dateinamen sind wie folgt aufgebaut:
// CO2,x=.0003,T=300K,P=1atm,L=100000cm,300_400.csv
// CO2,x=.0003,T=300K,P=1atm,L=100000cm,400_500.csv
// ...
// CO2,x=.0003,T=300K,P=1atm,L=100000cm,4900_5000.csv
//
// Quelle: http://www.spectraplot.com/absorption
// Als Weglänge wird 100000 cm eingegeben
// Die Bandbreite sollte 100 cm^-1 sein
// Die runtergeladenen CSV Dateien müssen alle umbenannt werden, damit die Frequenzen im Dateinamen enthalten sind
string[] lines = File.ReadAllLines("CO2,x=.0003,T=300K,P=1atm,L=100000cm," + // Datei in Zeilen zerlegen
i.ToString() + "_" + (i + 100).ToString() + ".csv");
for (int j = 0; j < 10000; j++) // Jede Datei enthält ein Spektrum mit 10000 Punkten
{
string[] entry = lines[j + 1].Split(','); // Eine Zeile in Spalten zerlegen
double a = weglaenge * System.Convert.ToDouble(entry[1], invC);
if (a == 0) a = 1e-14; // Einträge die Null sind müssen korrigiert werden.
// Das betrifft immer den ersten Eintrag in jeder Datei, wegen eines
// Fehlers bei der Erzeugung der CSV Dateien.
absorption[100 * i + j] = a;
}
}
// Emissionsspektrum des schwarzen Körpers berechnen
double h = 6.626e-34; // Plancksches Wirkungsquantum
double k = 1.38e-23; // Boltzmann-Konstante
double temp = 288; // Temperatur in Kelvin
double summe = 0;
double maximum = 0;
for (int i = 100; i < 500000; i++)
{
double wellenzahl = i / 100; // Wellenzahl in cm^-1
double frequenz = wellenzahl * 3e10; // Frequenz in Hz
blackbody[i] = frequenz * frequenz * frequenz / (Math.Exp(h * frequenz / k / temp) - 1.0);
summe += blackbody[i];
if (blackbody[i] > maximum) maximum = blackbody[i];
}
for (int i = 100; i < 500000; i++)
{
blackbody[i] /= maximum; // auf Maximum = 1 normieren
}
int x, y;
double summe_p1 = 0;
double summe_p2 = 0;
double summe_p3 = 0;
int start = 50000;
int stop = 100000;
for (int i = start; i < stop; i++)
{
x = (i - start) * panel1.Width / (stop - start);
// y = panel1.Height / 2 - (int)(5 * Math.Log(absorption[i]));
// g.FillRectangle(blueBrush, x, y, 1, 1);
y = (int) (panel1.Height * ( 1 - blackbody[i]));
g.FillRectangle(greenBrush, x, y, 1, 1);
double p2 = blackbody[i] * (1 - Math.Exp(-2 * absorption[i])); // Leistung, die bei dieser Frequenz absorbiert wird, bei 2 * x_CO2
summe_p2 += p2;
y = (int)(panel1.Height * (0.9999 - p2));
if (y < 0) y = 0;
g.FillRectangle(yellowBrush, x, y, 1, 1);
double p1 = blackbody[i] * (1 - Math.Exp(-absorption[i])); // Leistung, die bei dieser Frequenz absorbiert wird, bei 1 * x_CO2
summe_p1 += p1;
y = (int)(panel1.Height * (0.9999 - p1));
if (y < 0) y = 0;
g.FillRectangle(redBrush, x, y, 1, 1);
double p3 = p2 - p1; // Leistung, die zusätzlich absorbiert wird
summe_p3 += p3;
y = (int)(panel1.Height * (0.9999 - p3));
if (y < 0) y = 0;
g.FillRectangle(blackBrush, x, y, 1, 1);
}
richTextBox1.AppendText("Start-Frequenz: " + ((double)start / 100).ToString("F3") + "cm^-1 ");
richTextBox1.AppendText("Stop-Frequenz: " + ((double)stop / 100).ToString("F3") + "cm^-1 ");
richTextBox1.AppendText("Start-Wellenlänge: " + (1e6 / (double)start).ToString("F3") + "µm ");
richTextBox1.AppendText("Stop-Wellenlänge: " + (1e6 / (double)stop).ToString("F3") + "µm \n");
richTextBox1.AppendText("Grün: Erdboden als schwarzer Strahler mit der Temperatur " + temp.ToString("F3") + " K \n");
richTextBox1.AppendText("Rot: Absorbierte Energie bei 0.03% CO2: " + summe_p1.ToString("F3") + "\n");
richTextBox1.AppendText("Gelb: Absorbierte Energie bei 0.06%_CO2: " + summe_p2.ToString("F3") + "\n");
richTextBox1.AppendText("Schwarz: Zusätzlich absorbierte Energie bei 0.06% CO2: " + summe_p3.ToString("F3") + "\n");
}
}
}
Alles anzeigen