Список использованных источников
1.Программирование на языке Си [Электронный ресурс] : учеб. пособие / Р. Ю. Царев. - Красноярск: Сиб. федер. ун-т, 2014. - 108 с. - Режим доступа: http://znanium.com/bookread2.php?book=510946
2.Программирование на языке Pascal: Пособие / Рапаков Г.Г., Ржеуцкая С.Ю. - СПб:БХВ-Петербург, 2014. - 473 с. - Режим доступа: http://znanium.com/bookread2.php?book=940323
3. Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ. Мейерс Скот. –ДМК Пресс 2017. – 300 с.
4. Программирование на языке С++: Учебное пособие / Т.И. Немцова, С.Ю. Голова, А.И. Терентьев; Под ред. Л.Г. Гагариной. - М.: ИД ФОРУМ: ИНФРА-М, 2012. - 512 с. - Режим доступа: http://znanium.com/bookread2.php?book=244875
Приложение
Задание №1:
#include
#include
const double e =0.025;
int main(){
double y,t,result_1, result_2;
double x[5] = {-0.63,-0.35,-0.12,0.35,0.57};
for (int i = 0; i < 5; ++i) {
y = 0.7 * x[i] + 0.01 * x[i] * x[i];
result_2 = 5 * x[i] * log((1 + y) / (1 - y));
t = y;
result_1 = t;
int index = 1;
while (fabs(t) > e) {
t *= y * y * (index * 2 - 1) / (index * 2 + 1);
++index;
result_1 += t;
}
result_1 *= 2 * 5 * x[i];
std::cout << "result_1\t" << result_1 << "\tresult_2\t" << result_2 << "\n";
}
return 0;
Тест:
Числовые данные:
|
|
n
|
x1
|
x2
|
x3
|
x4
|
x5
|
x6
|
ж)
|
0,025
|
5
|
-0.63
|
-0.35
|
-0.12
|
0.35
|
0.57
|
-
|
В процессе выполнения программы мы получаем значения result_1 при помощи суммы ряда, и result_2 при помощи обычной формулы.
При этом погрешность не превышает e = 0.025
result_1 2.94867 result_2 2.9519
result_1 0.870114 result_2 0.870743
result_1 0.100863 result_2 0.100864
result_1 0.879203 result_2 0.879866
result_1 2.41648 result_2 2.43008
Задание №2:
#include
using namespace std;
void CoutSys(double **a, double *y, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << a[i][j] << "*x" << j;
if (j < n - 1)
cout << " + ";
}
cout << " = " << y[i] << endl;
}
}
double *methodGauss(double **a, double *y, int n){
double *x,max;
int k, index;
const double eps = 0.00000001; // точность
x = new double[n];
k = 0;
while (k < n) {
// Поиск строки с максимальным a[i][k]
max = abs(a[k][k]);
index = k;
for (int i = k + 1; i < n; ++i) {
if (abs(a[i][k]) > max) {
max = abs(a[i][k]);
index = i;
}
}
// Перестановка строк
if (max < eps) {
// нет ненулевых диагональных элементов
cout << "Решение получить невозможно из-за нулевого столбца ";
cout << index << " матрицы A\n";
return 0;
}
for (int j = 0; j < n; ++j) {
double temp = a[k][j];
a[k][j] = a[index][j];
a[index][j] = temp;
}
double temp = y[k];
y[k] = y[index];
y[index] = temp;
// Нормализация уравнений
for (int i = k; i < n; ++i) {
double temp = a[i][k];
if (abs(temp) < eps) continue; // для нулевого коэффициента пропустить
for (int j = 0; j < n; j++) {
a[i][j] = a[i][j] / temp;
}
y[i] = y[i] / temp;
if (i == k) // уравнение не вычитать само из себя
continue;
for (int j = 0; j < n; ++j) {
a[i][j] = a[i][j] - a[k][j];
}
y[i] = y[i] - y[k];
}
++k;
}
// обратная подстановка
for (int i = n -1; i >= 0; --i){
x[i] = y[i];
for (int j = 0; j < i; ++j){
y[j]=y[j] - a[j][i] * x[i];
}
}
return x;
}
int main(){
double **a, *y , *x;
int n;
cout << "number of equations : \n";
cin >> n;
a = new double *[n];
y = new double[n];
for (int i =0; i < n; ++i){
a[i] = new double[n]; // n - количество переменных можно изменить
for (int j = 0; j < n; ++j){
cout << "a["<cin >> a[i][j];
}
}
for (int i =0; i < n; ++i){
cout << "y[" << i << "] = ";
cin >> y[i];
}
CoutSys(a,y,n);
x = methodGauss(a,y,n);
for (int i = 0; i < n; ++i){
cout << "x[" << i << "] = " << x[i] << endl;
delete[] a[i];
}
delete[] a;
delete[] y;
delete[] x;
return 0;
}
Тест:
Система уравнений
3x+2y-5z = -1;
2x-y+3z = 13;
x+2y-z=9;
Консольный ввод-вывод:
number of equations :
3
a[0][0] = 3
a[0][1] = 2
a[0][2] = -5
a[1][0] = 2
a[1][1] = -1
a[1][2] = 3
a[2][0] = 1
a[2][1] = 2
a[2][2] = -1
y[0] = -1
y[1] = 13
y[2] = 9
3*x0 + 2*x1 + -5*x2 = -1
2*x0 + -1*x1 + 3*x2 = 13
1*x0 + 2*x1 + -1*x2 = 9
x[0] = 3
x[1] = 5
x[2] = 4
Задание №3
#include
#include
double determine_2_2(double** a){
double result = a[0][0]*a[1][1]-a[0][1]*a[1][0];
return result;
}
double** Nminor(int i,int j, double** a,int n, int m){
double** minorA = new double*[n-1];
for (int k =0; k < n-1; k++){
minorA[k] = new double[m-1];
}
int indexA=0;
for (int k = 0; k < n; ++k){
if (k == i)
++k;
int indexB = 0;
for (int l =0; l < m; ++l){
if (l==j)
++l;
minorA[indexA][indexB] = a[k][l];
indexB++;
}
indexA++;
}
return minorA;
}
double determine_3_3(double** b){
double result=0;
for (int i =0; i < 3; ++i){
int znak =1;
if ((i+1)%2==0){
znak =-1;
}
result +=znak*b[0][i]*determine_2_2(Nminor(0,i,b,3,3));
}
return result;
}
double **Determinant(double **a, double *y, int n, int j){
double** result = new double*[n];
for (int i =0; i < n; ++i){
result[i] = new double[n];
}
for (int i =0; i < n; ++i){
for (int k = 0; k < n; ++k){
if (k==j){
result[i][k]=y[i];
}
else {
result[i][k]=a[i][k];
}
}
}
return result;
}
double *methodKramer(double **a, double *y, int n){
double* x;
x = new double[n];
double del;
if (n==2){
del= determine_2_2(a);
}
else if (n==3){
del = determine_3_3(a);
}
for (int i = 0; i < n; ++i){
if (n==2){
x[i] = determine_2_2(Determinant(a,y,n,i))/del;
}
else if (n==3){
x[i] = determine_3_3(Determinant(a,y,n,i))/del;
}
}
return x;
}
int main() {
int n;
double **b = new double *[n];
double *y = new double[n];
for (int i = 0; i < n; ++i) {
b[i] = new double[n];
}
std::ifstream fin("input.txt");
if (fin.is_open()) {
fin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
fin >> b[i][j];
}
fin >> y[i];
}
fin.close();
}
double *x;
x = methodKramer(b, y, n);
std::ofstream fout("output.txt");
if (fout.is_open()){
for (int i = 0; i < n; ++i) {
fout << x[i] << " ";
}
}
for (int i =0; i < n; ++i){
delete[] b[i];
}
delete x;
delete b;
return 0;
}
Тест:
Система уравнений
5x+4y+4z = 11;
4x+5y+4z = 8;
4x+4y+5z=7;
Входные данные – “input.txt”
3
5 4 4 11
4 5 4 8
4 4 5 7
Выходные данные – “output.txt”
3 0 -1
Do'stlaringiz bilan baham: |