Текущая версия |
Ваш текст |
Строка 1917: |
Строка 1917: |
| величины. | | величины. |
| | | |
− | Cкачать программу можно [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
| + | Посмотреть программу можно [http://tm.spbstu.ru/Файл:Loseva.rar здесь] |
− | | |
− | <div class="mw-collapsible-content">
| |
− | <syntaxhighlight lang="cpp" line start="1" enclose="div">
| |
− | #include <iostream>
| |
− | | |
− | using namespace std;
| |
− | | |
− | #define N 5//количество точек
| |
− | | |
− | const double l1 = 5;//задаём начальный шаг функций
| |
− | const double l2 = 0.7;//шаг для интерполяции
| |
− | | |
− | class Func
| |
− | {//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
| |
− | | |
− | public:
| |
− | Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
| |
− | {
| |
− | for (int i = 0; i< size_; i++)
| |
− | {
| |
− | ax[i] = 0;
| |
− | by[i] = 0; //все элементы обоих массивов обнуляются
| |
− | }
| |
− | }
| |
− | | |
− | void print()//вывод на экран
| |
− | {
| |
− | cout << "x: ";
| |
− | for (int i = 0; i < size_; i++)
| |
− | cout << ax[i] << " ";
| |
− | cout << endl << "y: ";
| |
− | for (int i = 0; i < size_; i++)
| |
− | cout << by[i] << " ";
| |
− | cout << endl;
| |
− | }
| |
− | | |
− | Func &operator+(Func &f2)//функция перегрузки:cложение функций
| |
− | {
| |
− | Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
| |
− | for (int i = 0; i < size_; i++)
| |
− | {
| |
− | result->ax[i] = this->ax[i];//суммируем координаты X
| |
− | result->by[i] = f2.by[i] + this->by[i];//суммируем координаты Y
| |
− | }
| |
− | cout << "Sum f(x)=f1+f2:" << endl;//выводим на экран сумму функций
| |
− | result->print();
| |
− | return *result;
| |
− | }
| |
− | | |
− | void Int(double L) //метод Интерполяции
| |
− | {
| |
− | int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
| |
− | Func result = Func(M);//cоздаём функцию,в кторой будет храниться результат интерполяции
| |
− | cout << "M =" << M << endl;//выводим M для проверки
| |
− | cout << "Interpolation: " << endl;
| |
− | int t;
| |
− | for (int i = 1; i < M; i++)
| |
− | {
| |
− | result.ax[0] = this->ax[0];
| |
− | result.ax[i] = result.ax[i - 1] + L;//интерполируем Х,прибавляя шаг к каждому предыдущему элементу
| |
− | t = (result.ax[i - 1] - result.ax[0]) / l1;//считаем номер элемента,"левого" от искомого
| |
− | | |
− | //интерполируем Y по формуле
| |
− | result.by[i] = this->by[t] + ((result.ax[i] - this->ax[t]) / (this->ax[t + 1] - this->ax[t]))*(this->by[t + 1] - this->by[t]);
| |
− | | |
− | }
| |
− | | |
− | result.print();//выводим результат
| |
− | }
| |
− | | |
− | void aprox()//Апроксимация
| |
− | {
| |
− | double a=0;
| |
− | for(int i=0;i<size_;i++)//считаем сумму x
| |
− | a=this->ax[i]+a;
| |
− |
| |
− | | |
− | double b=0;
| |
− | for(int i=0;i<size_;i++)//считаем сумму y
| |
− | b=this->by[i]+b;
| |
− |
| |
− | | |
− | double c=0;
| |
− | for(int i=0;i<size_;i++)//считаем сумму квадратов x
| |
− | c=(this->ax[i])*(this->ax[i])+c;
| |
− |
| |
− | | |
− | double d=0;
| |
− | for(int i=0;i<size_;i++)//считаем сумму xy
| |
− | d=(this->ax[i])*(this->by[i])+d;
| |
− |
| |
− | | |
− | //затем решаем систему для у=kx+m
| |
− | //(1)c*k+a*m=d
| |
− | //(2)a*k+size_*m=b;
| |
− | //k=(d-am)/с
| |
− | //подставим в (2)
| |
− | double m;
| |
− | m=(b*c-a*d)/(c*size_-a*a);
| |
− | double k;
| |
− | k=(d-a*m)/c;
| |
− | cout<<"aproximacia :: ";
| |
− | cout<<"y="<<k<<"x+"<<m<<endl;
| |
− | | |
− | }
| |
− | | |
− | | |
− | double *ax;
| |
− | double *by;
| |
− | | |
− | private:
| |
− | int size_;//размер массива
| |
− | };
| |
− | | |
− | | |
− | | |
− | | |
− | class Cord//класс,создающий и хранящий значение функций
| |
− | {
| |
− | public:
| |
− | Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
| |
− | {
| |
− | }
| |
− | | |
− | void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
| |
− | {
| |
− | int i;
| |
− | func.ax[0] = x0;
| |
− | for (i = 1; i < N; i++)//считаются иксы
| |
− | {
| |
− | func.ax[i] = x0 + s;
| |
− | x0 = func.ax[i];
| |
− | }
| |
− | for (i = 0; i<N; i++)
| |
− | func.by[i] = func.ax[i];//считаем координаты у
| |
− | cout << "f1 :" << endl;
| |
− | func.print();
| |
− | cout << endl;
| |
− | }
| |
− | | |
− | void Fyx2(Func func)//метод,считающий координаты нашей функции y=x+1
| |
− | {
| |
− | int i;
| |
− | func.ax[0] = x0;
| |
− | for (i = 1; i<N; i++)//считаем иксы
| |
− | {
| |
− | func.ax[i] = x0 + s;
| |
− | x0 = func.ax[i];
| |
− | }
| |
− | for (i = 0; i<N; i++)
| |
− | func.by[i] = func.ax[i] + 1;//считаем игрики
| |
− | cout << "f2 :" << endl;
| |
− | func.print();
| |
− | cout << endl;
| |
− | }
| |
− | | |
− | private:
| |
− | double x0;//начальная координата
| |
− | double s;//шаг
| |
− | };
| |
− | | |
− | int main()
| |
− | {
| |
− | Func f1(N);//создание функции f1
| |
− | Func f2(N);//создание f2
| |
− | Cord s1(0, l1);//cоздаём объект s1
| |
− | Cord s2(0, l1);//cоздаём объект s2
| |
− | s1.Fyx1(f1);//задаём координаты 1ой функции
| |
− | s2.Fyx2(f2);//задаём координаты 2ой функции
| |
− | | |
− | //сложение функций:
| |
− |
| |
− | Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
| |
− | | |
− | f1.Int(l2);//Интерполируем f1 с новым шагом l2
| |
− | f1.aprox();//Апроксимируем f1
| |
− |
| |
− | getchar();
| |
− | return 0;
| |
− | }
| |
− | | |
− | </syntaxhighlight>
| |
− | </div>
| |
| | | |
| '''[[Сергей Ляжков]]''' | | '''[[Сергей Ляжков]]''' |