Доброго времени суток.
Сдал первую лабу по методу Монте-Карло..
Вторая лаба Цель работы: изучить методы моделирования нормально распределенных случайных величин и проверки их с помощью критерия Пирсона.
Есть прога готовая, но по тексту программы во многих местах не понимаю что, где и как делается... от части потому что саму математическую модель не понимаю ... от части некоторый код просто не понимаю...
Помогите разобратся в самом коде, я некоторые комментарии проставил но не факт что они верные... помогите проставить комментарии везде? и собственно понять саму проверку с помощью Пирсона может в более простом варианте объяснения? Просто те которые сижу читаю и пытаюсь понять , не могу осмыслить мат знаний не хватает...
mainwindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "stdlib.h"
#include "time.h"
#include "QDebug"
#include "math.h"
#include <QGraphicsScene>
float chi2inv(float a, int n);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
n=6;
pi=M_PI;
}
MainWindow::~MainWindow()
{
delete ui;
}
float MainWindow::r()
{
float r= (float) rand() / RAND_MAX;
return r;
}
void MainWindow::on_pushButton_clicked()
{
srand(time(NULL));
r_count=ui->sb_r_count->value();//количество случайных чисел
mx=ui->dsb_mx->value();//математическое ожидание
dx=ui->dsb_dx->value();//средне квадратичное отклонение
z.clear();
x.clear();
v.clear();
fi.clear();
fp.clear();
xi.clear();
xip.clear();
for(int i=0;i<r_count;i++)// цикл по случайным числам
for(int j=0;j<n;j++) //цикл по количеству эксперементов
{
if (j==0) v.append(r()); //если первый эксперемент то записать в конец строки v значение r
else v[i]+=r();// иначе заполнять массив увеличивая каждый раз на значение r
}
for(int i=0;i<r_count;i++)// цикл по случайным числам
{
z.append((v[i]-(n/2.0))/sqrt(n/12.0));// не понимаю формулу
}
for(int i=0;i<r_count;i++)// цикл по случайным числам
{
x.append(mx+z[i]*dx); //не понимаю формулу
}
for(int i=0;i<r_count;i++)// цикл по случайным числам
{
int j=fi.indexOf((int)(x[i]*10));
if(j==-1)
{
fi.append((int)(x[i]*10));
fp.append(1);
}
else
{
fp[j]+=1;
}
}
for(int i=0;i<fi.count();i++)// цикл по случайным числам
{
qDebug()<<"значения х:"<<fi[i]<<" вероятность: "<<fp[i];
}
int count=0;
for(int i=0;i<fi.count();i++)// цикл по случайным числам
{
count+=fp[i];
}
qDebug()<<"Itogo: "<<count;
this->update();
float pi2=sqrt(2.0*pi);
for(float i=(mx-4*dx);i<=(mx+4*dx);i+=0.1)
{
xi.append(i*10);
xip.append((1.0/(dx*pi2))*exp(-((i-mx)*(i-mx))/(2.0*dx*dx)));
}
QGraphicsScene *scena=new QGraphicsScene;
scena->addLine(200,150,200,0,QPen(Qt::black));
scena->addLine(0,150,600,150,QPen(Qt::black));
for(int i=0;i<61;i++)
{
scena->addLine(i*10,150-5,i*10,150+5,QPen(Qt::black));
}
for(int i=0;i<31;i++)
{
scena->addLine(i*100,150-10,i*100,150+10,QPen(Qt::black));
}
for(int i=0;i<fi.count();i++)
{
scena->addEllipse(200+fi[i],150-10000*fp[i]/r_count,1,1,QPen(Qt::black));
}
for(int i=0;i<xi.count();i++)
{
scena->addEllipse(200+xi[i],150-xip[i]*1000,1,1,QPen(Qt::red));
}
xiexp=0.0;
int countxi=xi.count();
int ix=0;
float rc=(float)r_count;
for(ix=0;ix<countxi;ix++)
{
int jf=0;
while(xi[ix]!=fi[jf] && jf<fi.count()-1){jf++;}
xiexp+=0.1*((fp[jf]-xip[ix]*r_count)*(fp[jf]-xip[ix]*r_count))/((xip[ix])*r_count);
}
ui->label_3->setText(QString::number(xiexp));
ui->graphicsView->setScene(scena);
float min=chi2inv(1-0.01,r_count-3);
float min25=chi2inv(1-0.25,r_count-3);
float mid=chi2inv(1-0.5,r_count-3);
float mid75=chi2inv(1-0.75,r_count-3);
float max=chi2inv(1-0.999,r_count-3);
ui->label_4->setText(QString::number(mid));
ui->label_5->setText(QString::number(max));
ui->label_10->setText(QString::number(min));
ui->label_12->setText(QString::number(min25));
ui->label_14->setText(QString::number(mid75));
}
float chi2inv(float a, int n) {
float d;
if(a >= 0.001 && a < 0.5)
d = - 2.0637 * pow((log(1.0/a) - 0.16), 0.4274) + 1.5774;
else if(a <= 0.999)
d = 2.0637 * pow((log(1.0/(1 - a)) - 0.16), 0.4274) - 1.5774;
else
return 0;
float A = d * sqrt(2);
float B = 2.0/3 * (d * d - 1);
float C = d * (d * d - 7)/(9 * sqrt(2));
float D = (6 * pow(d, 4) + 14 * d * d - 32)/405;
float E = d * (9 * pow(d, 4) + 256 * d * d - 433) / (4860 * sqrt(2));
return n + A * sqrt(n) + B + C/sqrt(n) + D/n + E/(n*sqrt(n));
}
main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QVector2D>
#include "QPainter"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
float r();
int r_count;
int n;
QVector<float> v;
QVector<float> z;
QVector<float> x;
float mx;
float dx;
float pi;
QVector<float> fi;
QVector<float> fp;
QVector<float> xi;
QVector<float> xip;
float xiexp;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Прикрепленные файлы
lab2.zip ( 8.5 килобайт )
Кол-во скачиваний: 84