Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2009, 21:14   #1
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию Метод итераций и метод Зейделя

Здравсвуйте программисты! Спасибо всем за помощь в предыдущих темах, осталась последняя лаба, которую нужно решить по предмету "Численные методы" и сдать преподу до понедельника успеть, остальные лабы прошли на ура. Подскажите пожалуйста как решить методом Зейделя и итераций вот эти 2 системы уравнений, буду очень благодарен Вот фото:

Нашёл такой код, не знаю,правильно,согласно этим уравнениям.

Код:
#define eps 0.0001 //требуемая точность вычислений
void iteration(double a[N][N],double b[N],double x[N])
{
 int i,j;
 double norma; //чебышевская норма вектора
 double xn[N]={0};//вектор для текущей итерации, начальное значение
       //должно быть равно начальному приближению
 
 for(i=0;i < N;i++)
  {
   x[i]=-b[i];

   for(j=0;j < N;j++)
   {
    if(i!=j)
     x[i]+=a[i][j]*x[j];
   }

   x[i]/=-a[i][i];
  }

  for(i=0;i < N;i++)
  {
   if(fabs(x[i]-xn[i]) > norma)
    norma=fabs(x[i]-xn[i]);
   xn[i]=x[i];
  }
Изображения
Тип файла: jpg 111.jpg (11.3 Кб, 282 просмотров)

Последний раз редактировалось prikolist; 16.06.2009 в 21:16.
prikolist вне форума Ответить с цитированием
Старый 17.06.2009, 15:00   #2
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Подскажите пожалуйста,как переделать вот этот код, это Метод Зейделя и итераций. Переделать в консоль на С++. Буду очень благодарен.

Код:
 



unit Iter;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TForm1 = class(TForm)

    rez: TMemo;

    B1: TButton;

    B2: TButton;

    procedure B1Click(Sender: TObject);

    procedure B2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.B1Click(Sender: TObject);

var x1,x2,x3,x4,f1,f2,f3,f4,t1,t2,t3,t4,e:real;

str1,str2,str3,str4,str5:string;

k:integer;

label S,F;

begin

k:=0;x1:=1.21;x2:=-0.72;x3:=-0.58;x4:=1.56;

rez.Clear;e:=0.001;

repeat

f1:=0.23*x1-0.14*x2+0.06*x3-0.12*x4+1.21;  

f2:=0.12*x1+0.32*x3-0.18*x4-0.72;

f3:=0.08*x1-0.12*x2+0.23*x3+0.32*x4-0.58;

f4:=0.25*x1+0.22*x2+0.14*x3+1.56;

    t1:=f1-x1;

    t2:=f2-x2;

    t3:=f3-x3;

    t4:=f4-x4; 

    x1:=f1;x2:=f2;x3:=f3;x4:=f4;

          inc(k);

until (abs(t1)<=e) and (abs(t2)<=e) and (abs(t3)<=e) and (abs(t4)<=e);

str(f1:6:3,str1);

str(f2:6:3,str2);

str(f3:6:3,str3);

str(f4:6:3,str4);

str(k,str5);

rez.Lines.Add(' ------- Результат вычислений ------- ');

rez.Lines.Add(' X1= '+str1+'  X2= '+str2+'  X3= '+str3+'  X4= '+str4);

rez.Lines.Add(' Количество итераций = '+str5);

end;

procedure TForm1.B2Click(Sender: TObject); // метод зейделя

var x1,x2,x3,x4,f1,f2,f3,f4,t1,t2,t3,t4,e:real;

str1,str2,str3,str4,str5:string;

k:integer;

begin

k:=0;x1:=1.21;x2:=-0.72;x3:=-0.58;x4:=1.56;

rez.Clear;e:=0.001;

repeat

f1:=0.23*x1-0.14*x2+0.06*x3-0.12*x4+1.21;

x1:=f1;

f2:=0.12*x1+0.32*x3-0.18*x4-0.72;

x2:=f2;

f3:=0.08*x1-0.12*x2+0.23*x3+0.32*x4-0.58;

x3:=f3;

f4:=0.25*x1+0.22*x2+0.14*x3+1.56;

x4:=f4;

    t1:=f1-x1;

    t2:=f2-x2;

    t3:=f3-x3;

    t4:=f4-x4;

          x1:=t1;x2:=t2;x3:=t3;x4:=t4;

                inc(k);

until (abs(t1)<=e) and (abs(t2)<=e) and (abs(t3)<=e) and (abs(t4)<=e);

str(f1:6:3,str1);

str(f2:6:3,str2);

str(f3:6:3,str3);

str(f4:6:3,str4);

str(k,str5);

rez.Lines.Add(' ------- Результат вычислений ------- ');

rez.Lines.Add(' X1= '+str1+'  X2= '+str2+'  X3= '+str3+'  X4= '+str4);

rez.Lines.Add(' Количество итераций = '+str5);

end;

end.
prikolist вне форума Ответить с цитированием
Старый 17.06.2009, 16:52   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вроде, код из первого поста верен.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 17.06.2009, 19:11   #4
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Мне нужно чтоб код был согласно картинке в самом начале темы. Подскажите пожалуйста.
prikolist вне форума Ответить с цитированием
Старый 17.06.2009, 21:35   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от prikolist
Мне нужно чтоб код был согласно картинке в самом начале темы. Подскажите пожалуйста.
У вас есть функция, которая принимает матрицу коэффициентов. Эту матрицу вам нужно заполнить. Примерно так:
Код:
double a[N][N],b[N],x[N];
int i;

a[0][0] = -1.01; a[0][1] = 0.02; a[0][2] = -0.62; a[0][3] = 0.08; b[0] = 1.3;
a[1][0] = -1.03; a[1][1] = 0.28; a[1][2] = 0.33; a[1][3] = -0.07; b[1] = -1.1;
a[2][0] = -1.09; a[2][1] = 0.13; a[2][2] = 0.42; a[2][3] = 0.28; b[2] = 1.7;
a[3][0] = -1.19; a[3][1] = -0.23; a[3][2] = 0.08; a[3][3] = 0.37; b[3] = 1.5;
Только вот не совсем понимаю, как выбирать начальное приближение для элементов массива x.

Ну вот когда все заполните, вызываете функцию, а потом выводите корни:
Код:
iteration(a,b,x);
for(i=0; i<N; i++)
 cout<<x[i]<<endl;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 17.06.2009, 22:30   #6
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Скажите,правильно ли сделал вот этот код методом итераций.

Из этого:
Код:
procedure TForm1.B1Click(Sender: TObject);

var x1,x2,x3,x4,f1,f2,f3,f4,t1,t2,t3,t4,e:real;

str1,str2,str3,str4,str5:string;

k:integer;

label S,F;

begin

k:=0;x1:=1.21;x2:=-0.72;x3:=-0.58;x4:=1.56;

rez.Clear;e:=0.001;

repeat

f1:=0.23*x1-0.14*x2+0.06*x3-0.12*x4+1.21;  

f2:=0.12*x1+0.32*x3-0.18*x4-0.72;

f3:=0.08*x1-0.12*x2+0.23*x3+0.32*x4-0.58;

f4:=0.25*x1+0.22*x2+0.14*x3+1.56;

    t1:=f1-x1;

    t2:=f2-x2;

    t3:=f3-x3;

    t4:=f4-x4; 

    x1:=f1;x2:=f2;x3:=f3;x4:=f4;

          inc(k);

until (abs(t1)<=e) and (abs(t2)<=e) and (abs(t3)<=e) and (abs(t4)<=e);

str(f1:6:3,str1);

str(f2:6:3,str2);

str(f3:6:3,str3);

str(f4:6:3,str4);

str(k,str5);

rez.Lines.Add(' ------- Результат вычислений ------- ');

rez.Lines.Add(' X1= '+str1+'  X2= '+str2+'  X3= '+str3+'  X4= '+str4);

rez.Lines.Add(' Количество итераций = '+str5);

end;
Попробывал перевести в этот.
Код:
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
double x1,x2,x3,x4,f1,f2,f3,f4,t1,t2,t3,t4,e;
String str1,str2,str3,str4,str5;

	do
{
f1=0.23*x1-0.14*x2+0.06*x3-0.12*x4+1.21;  
f2=0.12*x1+0.32*x3-0.18*x4-0.72; 
f3=0.08*x1-0.12*x2+0.23*x3+0.32*x4-0.58;
f4=0.25*x1+0.22*x2+0.14*x3+1.56;

    t1 = f1-x1;
    t2 = f2-x2;
    t3 = f3-x3;
    t4 = f4-x4; 
    x1 = f1;x2:=f2;x3:=f3;x4:=f4;
        k++;
} while ((abs(t1)<=e) &&(abs(t2)<=e) &&(abs(t3)<=e) &&(abs(t4)<=e));

	return 0;
}
prikolist вне форума Ответить с цитированием
Старый 17.06.2009, 22:56   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Не задаете начальных значений. То есть забыли перевести вот это
Код:
k:=0;x1:=1.21;x2:=-0.72;x3:=-0.58;x4:=1.56;

rez.Clear;e:=0.001;
И until переводится по-другому:
Код:
 while ((abs(t1)>e) ||(abs(t2)>e) ||(abs(t3)>e) ||(abs(t4)>e));
Насчет правильности самого кода... лично у меня сомнения. Но я уже не помню как там точно для систем уравнений пишется.

Вот тут посмотрите: http://mathalgo.blogspot.com/2007/11/blog-post_20.html

Да и вообще тут лучше через циклы делать, иначе код неуниверсальный.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 17.06.2009, 23:14   #8
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Вот метод итераций, как его подстроить, чтоб решило моё.

Метод итерации
Код:
#include "stdafx.h"
#define eps 0.0001 //требуемая точность вычислений
void iteration(double a[N][N],double b[N],double x[N])
{
 int i,j;
 double norma; //чебышевская норма вектора
 double xn[N]={0};//вектор для текущей итерации, начальное значение
       //должно быть равно начальному приближению
 


 do{
  norma=0.0;
  for(i=0;i < N;i++)
  {
   xn[i]=-b[i];

   for(j=0;j < N;j++)
   {
    if(i!=j)
     xn[i]+=a[i][j]*x[j];
   }

   xn[i]/=-a[i][i];
  }

  for(i=0;i < N;i++)
  {
   if(fabs(x[i]-xn[i]) > norma)
    norma=fabs(x[i]-xn[i]); //Вычисление нормы вектора
   x[i]=xn[i];
  }
  
 }
 while(norma > eps); //проверка на необходимую точность вычислений


 return;
}
Метод Зейделя
Код:
 for(i=0;i < N;i++)
  {
   x[i]=-b[i];

   for(j=0;j < N;j++)
   {
    if(i!=j)
     x[i]+=a[i][j]*x[j];
   }

   x[i]/=-a[i][i];
  }

  for(i=0;i < N;i++)
  {
   if(fabs(x[i]-xn[i]) > norma)
    norma=fabs(x[i]-xn[i]);
   xn[i]=x[i];
  }
Подскажите пожалуйста, завтра или в пятницу хочу сдать этот код, очень нужно. Как подстроить его под мои уравнения?

Последний раз редактировалось prikolist; 17.06.2009 в 23:22.
prikolist вне форума Ответить с цитированием
Старый 18.06.2009, 00:10   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Я же сказал: у вас есть функция, которая не зависит от каких-то исходных данных.
Просто передайте ей данные для вашей задачи (смотрите пост 5).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.06.2009, 13:05   #10
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Попробывал методом итераций, вот так, но выдаёи ошибку:
Неизвестный ' N '
Вот код:

Код:

#include "stdafx.h"
#include <iostream>
#define eps 0.0001 //требуемая точность вычислений
using namespace std;



void iteration(double a[N][N],double b[N],double x[N])
{
 int i,j;
 double norma; //чебышевская норма вектора
 double xn[N]={0};//вектор для текущей итерации, начальное значение
       //должно быть равно начальному приближению
 

a[0][0] = -1.01; a[0][1] = 0.02; a[0][2] = -0.62; a[0][3] = 0.08; b[0] = 1.3;
a[1][0] = -1.03; a[1][1] = 0.28; a[1][2] = 0.33; a[1][3] = -0.07; b[1] = -1.1;
a[2][0] = -1.09; a[2][1] = 0.13; a[2][2] = 0.42; a[2][3] = 0.28; b[2] = 1.7;
a[3][0] = -1.19; a[3][1] = -0.23; a[3][2] = 0.08; a[3][3] = 0.37; b[3] = 1.5;

 do{
  norma=0.0;
  for(i=0;i < N;i++)
  {
   xn[i]=-b[i];

   for(j=0;j < N;j++)
   {
    if(i!=j)
     xn[i]+=a[i][j]*x[j];
   }

   xn[i]/=-a[i][i];
  }

  for(i=0;i < N;i++)
  {
   if(fabs(x[i]-xn[i]) > norma)
    norma=fabs(x[i]-xn[i]); //Вычисление нормы вектора
   x[i]=xn[i];
  }
  
 }
 while(norma > eps); //проверка на необходимую точность вычислений


 return;
}


int main()
{
iteration(a,b,x);
for(i=0; i<N; i++)
 cout<<x[i]<<endl;
}
prikolist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод итераций и комбинированный метод prikolist Общие вопросы C/C++ 2 16.06.2009 20:51
Метод простых итераций church Общие вопросы C/C++ 3 06.06.2009 15:26
метод Зейделя на Паскале(график) Neznau Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2009 20:02