IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Решение системы нелинейных уравнений, Метод итераций и метод Зейделя...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Помогите, ребята! Про линейные системы информацию нашла.
А вот про нелинейные - не нашла ни слова... dry.gif

Задана система:
cos(x+0.5)-y=2
siny-2x=1

Требуется решить систему методом итераций и методом Зейделя. Метод Зейделя нашла только для линейных систем. Про итерации вообще молчу...
Помогите, плз!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


у нас на форуме такого не припомню, а вот в интернете полно, например вот или вот

и у нас нашел, тут : http://forum.pascal.net.ru/index.php?s=&sh...indpost&p=34479

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


klem4, пересмотри ссылки - там везде ЛИНЕЙНЫЕ системы blum.gif

...или разницы нет?

и у нас и в инете я искала, и все эти исходники мне попадались

но мне необходимы НЕЛИНЕЙНЫЕ
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Попробую что-нибуь поискать.

зы
Вот мне просто интересно, извиняюсь за оффтоп конечено, ты такая уже не первая, приходят люди и говорят : Привет, мне надо решить уровнение методом Васи Пупкина, у вас на сайте его нету что мне делать ? А перед тем как выдать задание, вам в течении семестра не давали этот алгоритм ? Просто сказали вот тебе начальные условия, вот название метода ищи где хочешь ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


оффф: самое интересное, что так оно и есть
учусь на заочном, препод дает конспект / одна из тем в конспекте - решение систем линейных уравнений / про нелинейные ни слова / а задание - сам видишь unsure.gif
кроме того, конспектов зачастую оказывается ох как недостаточно, а времени преподам дается слишком мало - они и десятой части не вычитывают...
вот так
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот посмотри, только решение на basic-e

Pешение нелинейной системы уpавнений методом Зейделя

ps сочувствую ...

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


не открывается: "Невозможно найти страницу"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Прикрепляю (это - то самое решение, которое нашел klem4):


Прикрепленные файлы
Прикрепленный файл  zeydel.rar ( 956 байт ) Кол-во скачиваний: 409
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


та да, ребятЫ...
если б я еще не в первый раз листинг на бейсике видела.... unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Сейчас попробую перевести на паскаль, заняться нечем .. но мне почему-то кажется что это не совсем то, что тебе нужно.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Хм вроде перевел с горем пополам, но что-то я не догоняю, программ практически при любых данных выдает один и тот-же результат, хотя возможно где-то я и ошибся :

Добавлено : гыгы надо просто ф-ю поменять ;)
uses crt;
const
n = 2;
var
f,x,w : array[1..n] of double;
eps,d,e,g : double;
i,k,m,fin,mis : integer;

procedure snur;
begin
f[1] := sqrt(x[1]) - sqrt(x[2] -1) - x[1] + 8;
f[2] := -sqrt(x[1]) - sqrt(9 - x[2]) - x[2] + 10;
end;

begin
clrscr;
write('Введите предельную погрешность : '); readln(eps);
writeln('Введите начальное приближение');
clrscr;
for i := 1 to n do begin
write('x[',i,']='); readln(x[i]);
end;
k := 0; d := 0.5; fin := 1; mis := 1;

repeat
inc(k);
d := -d;
gotoxy(4,60);
writeln(k,' - e приближение');
e := 0;
for i := 1 to n do begin
snur;
x[i] := x[i] + f[i];
end;
for i := 1 to n do e := e + f[i] * f[i];
e := sqrt(e);
g := e; w[round(1.5 + d)] := e;
gotoxy(5,60);
write('Текущая невязка ');
gotoxy(6,60);
writeln(g:3:3);
delay(100);
if (w[round(1.5 - d)] - w[round(1.5 + d)] < 0) and (k > 9) then begin
mis := 0;
fin := 0;
end;
if e > eps then
for i := 1 to n do x[i] := x[i] + f[i]
else begin
fin := 0;
for i := 1 to n do x[i] := x[i] + eps;
end;
gotoxy(1, 1);
for i := 1 to n do writeln('x[',i,']=',x[i]:3:2);
until (fin = 0) or (k>1000);

if mis = 1 then begin
writeln('Окончательный результат : ');
writeln('Точность удовлетворительная ');
end
else writeln('Процесс расходится ');
readln;
end.


Сообщение отредактировано: volvo -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


sad.gif выдавало ошибку 116 Must be in 8087 mode to compile this

добавила {N+}, тип данных изменила на real

я так поняла, что сами функции надо забивать так:

Код
  
    f[1] := cos(x[1]+0.5)-x[2]-2;  {перекидываю из правой части числа 2}
    f[2] := sin(x[2])-2*x[1]-1;      {и 1}


в результате работает, но:
- считает неправильно
- выдает большие числа
- ругается, что система расходится... wacko.gif

жах
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата(Jill @ 20.01.2006 10:25) *

выдавало ошибку 116 Must be in 8087 mode to compile this

добавила {N+}, тип данных изменила на real

Ты бы что-то одно делала... Или {$N+} или Real...

Ну, а если система расходится - ничего сделать с этим нельзя... Попробуй методом Ньютона - получишь тот же результат.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


согласна, что можно было просто Real

а вот только с {$N+} ошибка сохраняется...

volvo, получается, что система нерешаемая? вот, блин unsure.gif

хотя маткад решает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Приведи данные, которые ты вводишь в программу, и у тебя возникает ошибка... Только не надо говорить "любые" - меня интересует, что ТЫ вводишь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


ок, volvo, я поняла smile.gif

погрешность 0,01
приближенные значения вводила 1 и 1 (потом еще -1 и -1 - маткад выдает решение -0.945 и -1.097)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 52
Пол: Мужской

Репутация: -  0  +


Если вдруг кто-то знает метод итераций, то подскажите, а то у меня не получается.
Один из главных вопросов который меня волнует--это приведение системы линейных уравнений к виду удобному для итераций.
Т.е. если есть система АХ=В, то её надо привести к виду Х=GX+F.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 52
Пол: Мужской

Репутация: -  0  +


Я написал прогу, но она не работает.
Вот алгоритм: АХ=В- исходная система, Х=GX+F- эквивалентная ей система, где
G=E-(A^t*A)/нормуA^t*A
. F=A^t*B/норуA^t*A
нормаA^t*A=максимальная сумма элементов строки.
A^t- транспонированая матрица
X1=GX0+F {X0=F}
X1-X0—невязка(точность)
X2=GX1+F
X2-X1
X3=GX2+F
X3-X2
И т.д.


Код
program metod_iteracii;
  Uses CRT;
   type
matrica=array [1..4,1..4] of extended;
matrica1=array [1..4,1..1] of real;
var
R,G,G1,w,a,at,ata,e:matrica;
t,i,j,m,n,l,k:byte;
x,d,raz,c,b,b1,f,f1:matrica1;
max,max1,s:real;


procedure udo;{privedenie sistemi k vidu udobnomu dli iteracii}

begin

for i:=1 to n do
for j:=1 to m do
begin
s:=0;
   at[j,i]:=s+a[i,j]; {tranponirue matricu}
   end;

       writeln('matrica a ');
     for i:=1 to n do
     begin
       for j:=1 to m do
         write(a[i,j]:2:2,' ');
       readln;
         end;


         writeln('matrica яtranponirovanay');
     for i:=1 to n do
     begin
       for j:=1 to m do
         write(at[i,j]:2:2,' ');
      readln;
       end;
       {------------------------------}
        for i:=1 to n do
       for j:=1 to l do
       begin
         s:=0;
         for k:=1 to m do
           s:=s+a[i,k]*at[k,j]; {matrica=A*A tranponirovanai}
         ata[i,j]:=s;

      end;
       writeln('matrica at*a ');
     for i:=1 to n do
     begin
       for j:=1 to m do
         write(ata[i,j]:2:2,' ');
           readln;
          end;
   {-----------------------}

          for i:=1 to n do
          begin
               s:=0;
               begin
           for j:=1 to m do
       s:=s+abs(ata[i,j]); { vichislenie normirovanoi matrici}
        w[i,1]:=s;
        end;
        end;
  {--------------------------}
     { writeln('normirovanay matrica ');
     for i:=1 to n do
          begin
         write(w[i,1]:2:2,' ');
       writeln;
       end;}
{-----------------------}
  max:=0;
for i:=1 to n do
begin
  for j:=1 to m do

   if w[i,j]>max then
   max:=w[i,j];
   end;
   writeln('norma=', max:2:4);
{-----------------------------}
       for i:=1 to n do
begin
  for j:=1 to m do
   G[i,j]:=e[i,j]-(1/max)*ata[i,j]; {vichislenie matrici G}
      end;
     {-----------------}
     writeln('G ');
     for i:=1 to n do
     begin
       for j:=1 to m do
         write(G[i,j]:2:5,' ');
       readln;
          end;
     {---------------------}



      for i:=1 to n do

       begin
         s:=0;
         for k:=1 to m do
           s:=s+at[i,k]*b[k,1]*(1/max); {vichislenie matrico F}
         f[i,1]:=s;

      end;
       writeln('matrica f ');
     for i:=1 to n do
     begin

         write(f[i,1]:2:5,' ');
       writeln;

          end;

        f1:=f;

       end;

  {-------------------------}
  {----------------------}


procedure iterac(f:matrica1);


begin

   for i:=1 to n do
       for j:=1 to l do
       begin
         s:=0;
         for k:=1 to m do
           s:=s+G[i,k]*f[k,1];{G*X}
         c[i,j]:=s;
      end;
   {------------------------------------------------------}

       writeln ('matrica c=G*f');
       for i:=1 to n do

         write(c[i,1]:2:2,' ');
         writeln;

{-------------------------------------------------}
       begin
       for i:=1 to m do
        for j:=1 to n do
        x[i,j]:=c[i,j]+f1[i,j];
       end;
        writeln('matrica x');
     for i:=1 to l do

        write('x[',i,'1]=', x[i,1]:2:4,' ');
       writeln;

{---------------------------------------------------}
       begin
       for i:=1 to m do
        for j:=1 to n do
        raz[i,j]:=(x[i,j])-(f[i,j]); {nevyzca}
       end;
       writeln('matrica  raz');
     for i:=1 to l do

        write( raz[i,1]:2:4,' ');
       writeln;

{--------------------------------------}
             begin
                max:=abs(raz[1,1]);     {nahodim max nevyzcu}
                   for i:=1 to m do

                      if abs(raz[i,1])>max then max:=abs(raz[i,1]);
                end;
                write('max=',max:2:4,' ' );
                readln;

            begin
             if Abs(max)>0.00001   then

             begin

             f[i,j]:=x[i,j];
             iterac(x);
             end
            else  begin
             writeln('matrica x ');
     for i:=1 to l do


        write(x[i,1]:2:4,' ');
       writeln;
          end;
          end;
    end;


    procedure proverca;
    begin


   for i:=1 to n do
      begin
      R[i,m]:=A[i,1]*x[1,1]+A[i,2]*x[2,1]+A[i,3]*x[3,1]+A[i,4]*x[4,1];
      writeln('b[',i,m,']=',R[i,m]:2:2);
      end;
end;



    BEGIN


     n:=4;l:=4; m:=4;

  a[1,1]:=3.51; a[1,2]:=0.17; a[1,3]:=3.68; a[1,4]:=-0.28;

   a[2,1]:=4.52; a[2,2]:=2.11; a[2,3]:=6.63; a[2,4]:=-0.12;

   a[3,1]:=-2.11; a[3,2]:=3.17; a[3,3]:=1.06; a[3,4]:=-0.15;
   a[4,1]:=3.17; a[4,2]:=1.81; a[4,3]:=-3.17; a[4,4]:=0.22;




    e[1,1]:=1; e[1,2]:=0; e[1,3]:=0; e[1,4]:=0;

   e[2,1]:=0; e[2,2]:=1; e[2,3]:=0; e[2,4]:=0;

   e[3,1]:=0; e[3,2]:=0; e[3,3]:=1; e[3,4]:=0;
   e[4,1]:=0; e[4,2]:=0; e[4,3]:=0; e[4,4]:=1;


   b[1,1]:=0.75;
   b[2,1]:=1.11;
   b[3,1]:=0.21;
   b[4,1]:=0.05;

   { a[1,1]:=0.63; a[1,2]:=1.00; a[1,3]:=0.71; a[1,4]:=0.34;

   a[2,1]:=1.17; a[2,2]:=0.18; a[2,3]:=0.65; a[2,4]:=0.71;

   a[3,1]:=1.80; a[3,2]:=1.18; a[3,3]:=1.36; a[3,4]:=-2.35;
   a[4,1]:=3.58; a[4,2]:=0.21; a[4,3]:=3.45; a[4,4]:=-1.18;



   b[1,1]:=2.08;
   b[2,1]:=0.17;
   b[3,1]:=1.28;
   b[4,1]:=0.05;}



    udo;
    iterac(f);
    proverca;
    END.


М
теги...
мисс_граффити

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 52
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 20.01.2006 12:33) *


Ну, а если система расходится - ничего сделать с этим нельзя... Попробуй методом Ньютона - получишь тот же результат.

А метод Ньютона где можно найти ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 12.12.2024 1:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name