Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  Char.Funktion invertieren.  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 09:34:36 30.11.2016   Titel:   Char.Funktion invertieren.            Zitieren

Hallo,

ich möchte ei Programm schreiben, welches die charakteristische Funktion invertiert, um die Verteilung zu berechnen -- die Idee ist :

Ein Benutzer gibt einen Vektor (eine Liste) normalverteilter Größen an : im Endeffekt muss er also für jede Zufallsgröße zwei Dinge eingeben : Mittelwert und Varianz -- also zwei Vektoren sind einzugeben.

Seien die Mittelwerte §(\mu_{1},.....,\mu_{n})§ und die Varianzen §(\sigma_{1}^{2},....,\sigma_{n}^2)§

die charakteristische Funktion meiner Verteilung ist nun :

§f(t) = \prod_{k=1}^{n} \frac{1}{\sqrt{1-2i \sigma_{k}^2 t}}e^{\frac{it \mu_{k}^2}{1-it \sigma_{k}^2}}§

also da müssen nun Mittelwerte und Varianzen hinein'gespeist' werden und danach muss folgendes Integral numerisch gelöst werden (mittels Trapezregel zb, weil die doch relativ einfach ist):


§F(x) = \frac{1}{2} + \frac{1}{2 \pi} \int_{0}^{\infty} \frac{exp(itx)f(-t)-exp(-itx)f(t)}{it}dt§

Meine letzte Programmiervorlesung liegt schon eine Zeit zurück, daher möchte ich euch fragen, ob ihr vll Ansätze hättet, die das möglichst schnell zum Ziel führen?

Bin für jede Antwort dankbar

LG

Waldquelle
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 27418
Beitrag SeppJ Global Moderator 10:37:22 30.11.2016   Titel:              Zitieren

Du hast alles schon schön so beschrieben, wie ein Programmierer es tun würde. Ein Ablauf, genau abgegrenzte Objekte und Vorgänge, und so weiter. Fang doch einfach an und setz alles genau so um, wie du es beschrieben hast. Hast du mit irgendeinem dieser Schritte konkrete Schwierigkeiten?

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 16:41:00 30.11.2016   Titel:              Zitieren

Hallo,

also ich bin Mathematiker - daher auch eine gewisse strukturierte Herangehensweise :) einzig die Syntax (bzw die exakte spezifische Umsetzung) ist manchmal etwas problematisch ... also zb das Einlesen ? über eine for - Schleife ein array befüllen, oder gibts da bessere Zugänge etc -- aber ich programmiere mal los und melde mich dann bei Problemen + hänge ich dann immer den Code an =)

LG
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 10:08:34 02.01.2017   Titel:              Zitieren

Hallo,

also habe mich dieser Problemstellung wieder angenommen ..

und zwar mein erstes Problem :

das Einlesen der Werte ist kein Problem, da diese ganzzahlig sind etwa :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int eingabe(int k)
{ int z[k];
int b[k];
    int i;
    int y;
    for(i=0;i<k;i++)
    {
        cout <<"Eingabe des" << i << "ten Mittelwertes";
        cin >> z[i];
        std::cout << std::endl;
        cout <<"Eingabe der" <<i << "ten- Varianz";
        cin >> b[i];
        std::cout << std::endl;
    }
}


vermöge dieser einfachen Funktion.

Nun muss ich diese Werte in

§f(t) = \prod_{k=1}^{n} \frac{1}{\sqrt{1-2i \sigma_{k}^2 t}}e^{\frac{it \mu_{k}^2}{1-it \sigma_{k}^2}}§

speisen.
Wie soll ich das am besten realisieren ? über eine for - Schleife? vor allem .. wie ist es denn am besten auf die Werte zuzugreifen ? (im Hinblick auf die spätere numerische Integration)

Danke für eure Hilfe,

Lg Waldquelle
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 27418
Beitrag SeppJ Global Moderator 11:16:15 02.01.2017   Titel:              Zitieren

Das ist schon einmal falsch, insofern als dass das in Zeilen 2 und 3 C ist, sogar ein eher exotisches Feature von C, welches zudem noch falsch benutzt wurde. Felder variabler Größe in C++ macht man mit std::vector (was ein Zufall, wenn man mit der Aufgabenstellung vergleicht ;) ). Dann klappt das auch mit ganz normalen Übergaben ganz so, wie man intuitiv erwarten würde.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 13:52:46 02.01.2017   Titel:              Zitieren

Hallo,

also ich habe das mal <entsprechend deinem Vorschlag> adaptiert.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cmath>
#include <complex>
#include <math.h>
#include <vector>
 
using namespace std;
 
int m;
 
int eingabe(int m)
{
    std::vector<int>m1(m);
    std::vector<int>m2(m);
for(int i=0;i<m1.size();i++)
            {
                    cout <<"Geben Sie dem " << i << "ten Mittelwert ein \n";
                    cin >> m1[i];
                    cout <<"Geben Sie die " << i << "te Varianz ein \n";
                    cin >> m2[i];
                    if( m2[i] < 0)
                    {
                        cout << "Varianzen sind immer positiv";
                        break;
                    }
                   
            }
   
}
 
int main()
 
{
 
int k;
cout <<"Eingabe der Dimension des Mittelwert u. Varianzvektors \n";
cin >> k;
eingabe(k);
 
 
}


Verzeihung, falls das alles ein wenig simpel wirkt ... ich muss wirklich erst wieder ins technische beim Programmieren hineinfinden.

Lg
DirkB
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2016
Beiträge: 753
Beitrag DirkB Mitglied 14:06:39 02.01.2017   Titel:              Zitieren

Das größte Problem: Die Vectoren existieren nur innerhalb deiner Funktion eingabe.

Vectoren haben gegenüber den Arrays den Vorteil, dass sie ihre Größe ändern können.
Du musst am Anfang nicht wissen wie groß sie werden.

Wenn du schon mal C++ gelernt hast, dann sollte ein Online-Tutorial dich da wieder rein bringen.
Wenn nicht, dann brauchst du ein Buch!


Mach doch erstmal die Berechnung.
Die Eingabdaten kannst du am Anfang noch im Code fest vorgeben und später dann eine User-Eingabe vorsehen.
unskilled
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.07.2007
Beiträge: 3912
Beitrag unskilled Mitglied 14:38:24 02.01.2017   Titel:              Zitieren

das c++ spezifische könnte so in etwa aussehen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <vector>
 
std::vector<int> give_vector( const char* what = nullptr)
{
  std::vector<int> ret_val;
 
  if( what )
    std::cout << what << '\n';
 
  for( int to_add; std::cin >> to_add; )
    ret_val.push_back( to_add );
 
  std::cin.clear();
  return ret_val;
}
 
float integral_ausrechnen_mittels_trapzeregel(std::vector<int> mittelwert, std::vector<int> varianz)
{
  float ret_val = 0;
  for( ... )
    ret_val += ...
 
  return ret_val;
}
 
int main()
{
  auto mittelwerte = give_vector( "mittelwert 1...n" );
  auto varianzen = give_vector( "varianz 1...n" );
 
  if(mittelwerte.size() != varianzen.size())
    std::cerr << "." << std::endl;
 
  auto f = integral_ausrechnen_mittels_trapzeregel( mittelwerte, varianzen );
  std::cout << "trapezregel sagt: " << f << std::endl;
}


den algo zur trapezregel kannst du sicherlich selbst irgendwie formulieren und zum funktionieren bringen...

bb

_________________
Keiner kann besser nix als ich - Tagedieb mit Lächeln im Gesicht :o)
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 16:08:00 02.01.2017   Titel:              Zitieren

Hallo,

wow - vielen Dank für diesen Aufwand und deine Bemühungen :)


Beste Grüße
Waldquelle
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2016
Beiträge: 7
Beitrag Waldquelle Mitglied 16:22:25 02.01.2017   Titel:              Zitieren

eine Sache noch : die Funktion, die integriert wird, ist ja komplexwertig -- ist es sinnvoller (mittels Polarkorrd. etc) die Angelegenheit ins Reelle zu transformieren, oder mittels complex zu arbeiten?


LG
C++ Forum :: C++ (alle ISO-Standards) ::  Char.Funktion invertieren.  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.