объявляем первое число x1, которому присваиваем значение 9. А переменная x2 нужна для сохранения предыдущего значения x1. Данная строка: x1 = ((~x1<<2 ^ x2<<1 *i )*(~x1<<1 ^ x2<<2*i )+ (~x1<<4 ^ x2<<5*i)) % 101;
На самом деле проста.
~ - это инверсия.
<< - это сдвиг числа.
^ - это исключающее ИЛИ, а по простому она называется XOR.
% - это остаток от деления. То есть наши числа будут от 0 до 100.
Задача 2
Дан одномерный массив (вводиться с клавиатуры). Необходимо, заполнить одномерный массив, сделать вывод одномерного массива.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
const int n = 5; //объявляем константу для массива
void main () {
int x[n]; //объявляем переменный дробного типа
int i; //переменная для цикла
int sred = 0; //Переменная целого типа для вычисления суммы
for (i = 0; i < 5 ; i++){
std::cout<<"x["<<i<<"] = "; //На экран выводится ‘x[i] = ‘
std::cin>>x[i]; // вводим с клавиатуры целые числа
}
std::cout<<"\n"; //Переход на следующую строку
for (i = 0; i < 5 ; i++){
std::cout<<"x["<<i<<"] = "<<x[i]<<"\t";
//На экран выводится результат нашего ввода
}
for (i = 0; i < 5 ; i++){
sred = sred + x[i]; //суммируем элементы массива
}
std::cout<<"\n"; //Переход на следующую строку
sred = sred/n;
std::cout<<"Sred = "<<sred<<std::endl;
//На экран монитора выводится сообщение ‘x + y = 13’
_getch(); //Экран не закрывается, пока не зажата любая клавиша
}
Рисунок 2 – Результат выполнения программы
Задача 3
Дан двухмерный массив (ввод с клавиатуры). Необходимо, сделать ввод/вывод двумерного массива. Найти максимальный элемент двумерного массива.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
const int n = 3; //объявляем константу для массива
void main () {
int x[n][n]; //объявляем массив целого типа
int i,j; //переменная для цикла
int max = 0; //Переменная для вычисления максимального числа
for (i = 0; i < n ; i++)
for (j = 0; j < n ; j++){ //цикл ввода массива
std::cout<<"x["<<i<<","<<j<<"] = "; //На экран выводится ‘x[i][j] = ‘
std::cin>>x[i][j]; //вводим с клавиатуры целые числа
}
std::cout<<"\n"; //Переход на следующую строку
for (i = 0; i < n ; i++){ //цикл вывода массива
std::cout<<"\n"; //Переход на следующую строку
for (j = 0; j < n ; j++){
std::cout<<"x["<<i<<"]"<<"["<<j<<"] = "<<x[i][j]<<"\t"; //На экран выводится результат нашего ввода
}
}
max = x[0][0]; //Допустим максимальное число – это первое число массива
for (i = 1; i < n ; i++){ //цикл нахождения максимального элемента массива
std::cout<<"\n"; //Переход на следующую строку
for (j = 0; j < n ; j++){
if (x[i][j]> max) max = x[i][j]; //если есть число большее, чем max
//тогда max принимает значение этого числа
}
}
std::cout<<"\n"; //Переход на следующую строку
std::cout<<"Max = "<<max<<std::endl; //На экран монитора выводится максимальное число
_getch(); //Экран не закрывается, пока не зажата любая клавиша
}
Рисунок 3 – Результат выполнения программы
Задача 4
4.1. Метод Эйлера.
Решить дифференциальное уравнение уʹ=f(x,y) численным методом - это значит для заданной последовательности аргументов х0, х1…, хn и числа у0, не определяя функцию у=F(x), найти такие значения у1, у2,…, уn,
что уi=F(xi)(i=1,2,…, n) и F(x0)=y0. (1)
Таким образом, численные методы позволяют вместо нахождения функции У=F(x) получить таблицу значений этой функции для заданной последовательности аргументов. Величина h=xk-xk-1 называется шагом интегрирования.
Метод Эйлера относиться к численным методам, дающим решение в виде таблицы приближенных значений искомой функции у(х). Он является сравнительно грубым и применяется в основном для ориентировочных расчетов. Однако идеи, положенные в основу метода Эйлера, являются исходными для ряда других методов.
Рассмотрим дифференциальное уравнение первого порядка (1)
с начальным условием
x=x0, y(x0)=y0 (2)
Требуется найти решение уравнения (1) на отрезке [а,b].
Разобьем отрезок [a, b] на n равных частей и получим последовательность х0, х1, х2,…, хn, где xi=x0+ih (i=0,1,…, n), а h=(b-a)/n-шаг интегрирования.
В методе Эйлера приближенные значения у(хi)≈yi вычисляются последовательно по формулам уi+hf(xi, yi) (i=0,1,2…).
При этом искомая интегральная кривая у=у(х), проходящая через точку М0(х0, у0), заменяется ломаной М0М1М2… с вершинами Мi(xi, yi) (i=0,1,2,…); каждое звено МiMi+1 этой ломаной, называемой ломаной Эйлера, имеет направление, совпадающее с направлением той интегральной кривой уравнения (1), которая проходит через точку Мi. Если правая часть уравнения (1) в некотором прямоугольнике R{|x-x0|≤a, |y-y0|≤b}удовлетворяет условиям:
|f(x, y1)- f(x, y2)| ≤ N|y1-y2| (N=const), (3)
|df/dx|=|df/dx+f(df/dy)| ≤ M (M=const), то имеет место следующая оценка погрешности:
|y(xn)-yn| ≤ hM/2N[(1+hN)n-1], (4)
где у(хn)-значение точного решения уравнения (1) при х=хn, а уn- приближенное значение, полученное на n-ом шаге.
Формула (13) имеет в основном теоретическое применение. На практике иногда оказывается более удобным двойной просчет: сначала расчет ведется с шагом h, затем шаг дробят и повторный расчет ведется с шагом h/2. Погрешность более точного значения уn* оценивается формулой
|yn-y(xn)|≈|yn*-yn|. (5)
Метод Эйлера легко распространяется на системы дифференциальных уравнений и на дифференциальные уравнения высших порядков. Последние должны быть предварительно приведены к системе дифференциальных уравнений первого порядка.
4.2. Описание алгоритмов решения задачи
4.2.1. Описание переменных
Таблица1 – Описание переменных.
Наименование |
Тип |
Описание |
Входные данные |
||
Xi |
double |
Начальное значение (x) интервала вычисления |
Xkon |
double |
Конечное значение (x) интервала вычисления |
n |
integer |
Количество шагов |
Yi |
double |
Начальное значение y |
Kx |
double |
Коэффициент при переменой x |
ky |
double |
Коэффициент при переменной y |
Выходные данные |
||
h |
double |
Фиксированное приращение аргумента (x) |
res |
double |
Расчётное значение уравнение y’=F(x,y) в точке (x) |
Промежуточные |
||
i |
integer |
Счётчик цикла |
Yprom |
double |
Промежуточное значение y в точке Xprom |
Xprom |
double |
Промежуточное значение x при h/2 |
a |
double |
Решение уравнения в точках f(Xprom,Yprom) |
f1 |
double |
Функция f(x,y) |
4.2.2. Блок- схема главного модуля
4.2.3. Описание алгоритма главной программы.
Таблица 2 - Описание алгоритма главной программы.
Номер блока |
Описание |
1 |
Ввод начального и конечного значений интервала вычисления уравнения, количество шагов, начальное значение у, а также коэффициенты при kx и ky. |
2 |
Вычисление фиксированного приращения аргумента х |
3 |
Цикл с шагом 1 и конечным значением не превышающим количество шагов, который высчитывает значение y на определённом интервале |
4 |
Функция для расчёта уравнения вида y’=f(x,y); |
5 |
Вывод результатов на интервале X |
4.2.4. Блок-схема функции “func”.
4.2.5. Описание блок- схемы функции “func”.
Таблица 3 -Описание блок- схемы функции “func”.
Номер блока |
Описание |
1 |
Вычисление: функции f1 с подстановкой начальных значений; промежуточных значений Yprom и Xprom, значения a для вычисления f(Xprom,Yprom) и расчёт результатов функции и переход на следующий шаг. |
2 |
Приращение аргумента x на h |
3 |
Вывод результатов уравнения и интервала |
4.3. Программа решения дифференциального уравнения первого порядка методом Эйлера.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include<iostream>
using namespace std;
void func(double& Xi, double& Yi, double kx, double ky, double h);
int main()
{
double h,Xi,Yi,Xkon,kx,ky;
int n;
cout<<"\t"<<"\t"<<"************************************************n";
cout<<"\t"<<"\t"<<"* *"<<"\n";
cout<<"\t"<<"\t"<<"* Reshenie difurov 1 poryadka meodom Eulera *"<<"\n";
cout<<"\t"<<"\t"<<"*************************************************";
cout<<endl;
cout<<"Vvedite nachal'noe znachenie integrala [a,b,]=";
cin>>Xi;
cout<<"Vvedite konechnoe znachenie integrala [a,b]=";
cin>>Xkon;
cout<<"Vvedite chislo shagov=";
cin>>n;
h=(Xkon- Xi)/n;
cout<<endl;
cout<<"Vvedite nachal'noe uslovie y=";
cin>>Yi;
cout<<"Vvedite koefitcient pri x=";
cin>>kx;
cout<<"Vvedite koefitcient pri y=";
cin>>ky;
cout<<"|Interval| Chislo shagov |Shag prirasheniya|Nachal'noe Y|Uravnenie vida;|"<<"\n";
cout<<"|--------|-----------------|-----------------|-------------|-----------------|"<<"\n";
cout<<"|"<<"["<<Xi<<","<<Xkon<<"]" <<" |"<<n<<" |"<<h<<" |"<<Yi<<" |"<<"y'="<<kx<<"x"<<"+"<<ky<<"y"<<" |"<<"\n";
cout<<endl;
cout<<endl;
for (int i=1;i<=n;i++)
{
func(Xi,Yi,kx,ky,h);
cout<<"\n";
Рисунок 4 – Результат выполнения программы
Список использованных источников
1. Численные методы (анализ, алгебра, обыкновенные дифференциальные уравнения), Н.С. Бахвалов. Главная редакция физико-математической литературы изд-ва «Наука», М., 1975г.
2. Методы, теории обыкновенных дифференциальных уравнений. Н.И. Гаврилов. Государственное издательство «Высшая школа» Масква-1962г
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.