Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи по C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

derelict



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Код:
 
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <windows.h>
 
using namespace std;
 
// Функция для вывода значений коэффициентов и свободных членов
void vmatrix(double **a, double *b, int n)
{
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
      printf("%10.2f", a[i][j]);
    printf(" | %.2f\n", b[i]);
  }
}
 
void main()
{
  SetConsoleOutputCP(1251);
  SetConsoleCP(1251);
  // Запрашиваем количество уравнений системы
  int n;
  cout<<"Введите количество уравнений системы: ";
  cin>>n;
  // Запрашиваем точность решения
  double z;
  cout<<"Введите точность: ";
  cin>>z;
  cout<<endl;
  // Матрица значений коэффициентов
  double **a = new double*[n];
  // Вектор значений свободных членов
  double *b = new double[n];
  // Матрица B
  double **bb = new double*[n];
  // Вектор b (бета)
  double *vv = new double[n];
  // Вектор решений системы уравнений
  double *x = new double[n];
  for(int i = 0; i < n; i++)
  {
    a[i] = new double[n];
    bb[i] = new double[n];
    // Запрашиваем значения коэффициентов i-го уравнения
    cout<<"Уравнение #"<<(i + 1)<<endl;
    for(int j = 0; j < n; j++)
    {
      cout<<"Введите значение коэффициента #"<<(j + 1)<<": ";
      cin>>a[i][j];
    }
    // Запрашиваем значение свободного члена i-го уравнения
    cout<<"Введите значение свободного члена: ";
    cin>>b[i];
    cout<<endl;
  }
  // Выводим сформированную матрицу
  cout<<"Расширенная матрица исходной системы:"<<endl;
  vmatrix(a, b, n);
  // Приводим матрицу коэффициентов к виду x = B * x + b
  cout<<endl<<"Приводим матрицу к виду x = B * x + b"<<endl;
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
    {
      // Значение элемента матрицы B получается делением соответствующего элемента
      // матрицы коэффициентов на диагональный элемент
      bb[i][j] = 0;
      if(i != j)
      {
        bb[i][j] = -a[i][j] / a[i][i];
      }
    }
    // Значение элемента вектора b получается делением соответствующего свободного члена
    // на диагональный элемент матрицы коэффициентов
    vv[i] = b[i] / a[i][i];
  }
  cout<<endl<<"Матрица B и столбец  b (бета):"<<endl;
  vmatrix(bb, vv, n);
  // Задаем начальные приближения для решений системы
  for(int i = 0; i < n; i++)
  {
    x[i] = vv[i];
  }
  // Начало итерационного процесса
  while(true)
  {
    // Находим следующие приближения для решений системы
    for(int i = 0; i < n; i++)
    {
      // Сохраняем текущее приближение решения
      b[i] = x[i];
      // Вычисляем новое приближение
      double y = 0;
      for(int j = 0; j < n; j++)
      {
        y += bb[i][j] * x[j];
      }
      x[i] = y + vv[i];
    }
    // Проверка найденного приближения на точность
    int k = 0;
    // Проходим по всем найденным решениям
    for(int i = 0; i < n; i++)
    {
      // Если отклонение найденного решения от предыдущего не больше заданной точности
      if(fabs(b[i] - x[i]) <= z)
      {
        // Увеличиваем количество подходящих приближений
        k++;
      }
    }
    // Если подошли все приближения - решение найдено
    if(k == n)
    {
      break;
    }
  }
  // Выводим результат решения системы уравнений
  cout<<endl<<"Решение системы уравнений:"<<endl;
  for(int i = 0; i < n; i++)
  {
    printf("x%d = %.2f\n", i + 1, x[i]);
  }
  getchar();
}
 


Всего записей: 232 | Зарегистр. 11-06-2006 | Отправлено: 17:41 16-12-2009
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи по C/С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru