Редактирование: Информатика: Функции

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 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>
 
  
 
'''[[Сергей Ляжков]]'''
 
'''[[Сергей Ляжков]]'''
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)