Министерство образования и науки Российской Федерации. Механизмом, с помощью которого можно изменить число фотонов в некоторой полости, является поглощение или испускание фотонов атомами
Вариант 10
Красноярск, 2012 Задание: Решить краевую задачу ОДУ методом прогонки.
Тестовый пример: Точное решение (для проверки):
Решение: Код программы на языке C++: Mainwindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtGui> #include <QVector> #include <QtAlgorithms> namespace Ui { class MainWindow; } class MainWindow: public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~ MainWindow (); private: Ui::MainWindow *ui; QGraphicsScene *sc; QVector <double> x; QVector <double> y,t; }; #endif // MAINWINDOW_H kz_pr.cpp: #include <QVector>#include <cmath>double p(double x){ return -2*x; }double q(double x){ return -2; }double f(double x){ return -4*x; }void KraevayaZadacha(QVector<double> &y, QVector<double> &x, QVector<double> &t){ double a=0,b=1,a0=1,a1=-1,A=0,b0=1,b1=0,B=3.718,h=0.1,n=1/h+1; QVector<double>m(n-2),k(n-2),c(n-2),d(n-2); y.resize(n); t.resize(n); for(int i=0;i<n-2;++i) { m[i]=-2+h*p(i*h); k[i]=1-h*p(i*h)+h*h*q(i*h); } c[0]=(a1-a0*h)/(m[0]*(a1-a0*h)+k[0]*a1); d[0]=(k[0]*A*h)/(a1-a0*h)+f(a)*h*h; for(int i=1;i<n-2;++i) { c[i]=1/(m[i]-k[i]*c[i-1]); d[i]=f(i*h)*h*h-k[i]*c[i-1]*d[i-1]; } y[n-1]=(b1*c[n-3]*d[n-3]+B*h)/(b1*(1+c[n-3])+b0*h); for(int i=n-2;i>0;--i) { y[i]=c[i-1]*(d[i-1]-y[i+1]); } y[0]=(a1*y[1]-A*h)/(a1-a0*h); for(int i=0;i<n; ++i) t[i]=i*h+pow(2.718,i*h*i*h); for(int i=0;i<n;++i) { x.push_back(h*i); }} 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();} Mainwindow.cpp: #include "mainwindow.h"#include "ui_mainwindow.h"#include "kz_pr.cpp"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); sc=new QGraphicsScene(1,1,409,269); ui->graphicsView->setScene(sc); ui->graphicsView->setRenderHint(QPainter::Antialiasing, true); KraevayaZadacha(y,x,t); float temp=x[0]; float minx; for(int i=1;i<x.size();++i) { if(temp>x[i]) temp=x[i]; } minx=0;//temp; temp=x[0]; float maxx; for(int i=1;i<x.size();++i) { if(temp<x[i]) temp=x[i]; } maxx=temp; double dx=409/(maxx-minx+1); temp=y[0]; float miny; for(int i=1;i<y.size();++i) { if(temp>y[i]) temp=y[i]; } miny=0;//temp; temp=y[0]; float maxy; for(int i=1;i<y.size();++i) { if(temp<y[i]) temp=y[i]; } maxy=temp; double dy=269/(maxy-miny); float mint; for(int i=1;i<t.size();++i) { if(temp>t[i]) temp=t[i]; } mint=0;//temp; temp=t[0]; float maxt; for(int i=1;i<t.size();++i) { if(temp<t[i]) temp=t[i]; } maxt=temp; double dt=269/(maxt-mint); for(int i=0;i<y.size();++i) { QPair<int,int> tmp; tmp.first=(x[i]-minx)*dx*0.95+7; tmp.second=269-((y[i]-miny)*dy*0.8+7); sc->addLine(tmp.first,tmp.second,tmp.first,tmp.second,QPen(QColor(28,28,28),4)); tmp.second=269-((t[i]-miny)*dy*0.8+7); sc->addLine(tmp.first,tmp.second,tmp.first,tmp.second,QPen(QColor(28,28,28),4)); } sc->addLine(7,7,7,264,QPen(Qt::black,2)); sc->addLine(7,269-5,404,269-5,QPen(Qt::black,2)); QGraphicsTextItem *textx = new QGraphicsTextItem(QString().sprintf("X")); textx->setPos(390,269-30); sc->addItem(textx); QGraphicsTextItem *texty = new QGraphicsTextItem(QString().sprintf("Y")); texty->setPos(10,5); sc->addItem(texty); for(int i=0;i<y.size()-1;++i) { QPair<int,int> tmp,tmp1; tmp.first=(x[i]-minx)*dx*0.95+7; tmp.second=269-((y[i]-miny)*dy*0.8+7); tmp1.first=(x[i+1]-minx)*dx*0.95+7; tmp1.second=269-((y[i+1]-miny)*dy*0.8+7); sc->addLine(tmp.first,tmp.second,tmp1.first,tmp1.second,QPen(QColor(160,82,45),2)); tmp.second=269-((t[i]-miny)*dy*0.8+7); tmp1.second=269-((t[i+1]-miny)*dy*0.8+7); sc->addLine(tmp.first,tmp.second,tmp1.first,tmp1.second,QPen(QColor(119,136,153),2)); } ui->textEdit->setText(ui->textEdit->toPlainText()+QString().sprintf("Решение полученное программой:\n")); for(int i=0; i<y.size(); ++i) { ui->textEdit->setText(ui->textEdit->toPlainText()+QString().sprintf("y[%.3lf] = %.3lf\n",x[i],y[i])); } ui->textEdit->setText(ui->textEdit->toPlainText()+QString().sprintf("Точное решение:\n")); for(int i=0; i<y.size(); ++i) { ui->textEdit->setText(ui->textEdit->toPlainText()+QString().sprintf("y[%.3lf] = %.3lf\n",x[i],t[i])); }}MainWindow::~ MainWindow (){ delete ui;} Результат выполнения программы:
Решение полученное программой: y[0.000] = 1.118 y[0.100] = 1.230 y[0.200] = 1.364 y[0.300] = 1.521 y[0.400] = 1.704 y[0.500] = 1.917 y[0.600] = 2.164 y[0.700] = 2.455 y[0.800] = 2.800 y[0.900] = 3.214 y[1.000] = 3.718 Точное решение: y[0.000] = 1.000 y[0.100] = 1.110 y[0.200] = 1.241 y[0.300] = 1.394 y[0.400] = 1.573 y[0.500] = 1.784 y[0.600] = 2.033 y[0.700] = 2.332 y[0.800] = 2.696 y[0.900] = 3.148 y[1.000] = 3.718
Министерство образования и науки Российской Федерации
|