Помощь - Поиск - Пользователи - Календарь
Полная версия: Решение системы нелинейных уравнений
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Jill
Помогите, ребята! Про линейные системы информацию нашла.
А вот про нелинейные - не нашла ни слова... dry.gif

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

Требуется решить систему методом итераций и методом Зейделя. Метод Зейделя нашла только для линейных систем. Про итерации вообще молчу...
Помогите, плз!
klem4
у нас на форуме такого не припомню, а вот в интернете полно, например вот или вот

и у нас нашел, тут : http://forum.pascal.net.ru/index.php?s=&sh...indpost&p=34479
Jill
klem4, пересмотри ссылки - там везде ЛИНЕЙНЫЕ системы blum.gif

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

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

но мне необходимы НЕЛИНЕЙНЫЕ
klem4
Попробую что-нибуь поискать.

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

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

ps сочувствую ...
Jill
не открывается: "Невозможно найти страницу"
volvo
Прикрепляю (это - то самое решение, которое нашел klem4):
Jill
та да, ребятЫ...
если б я еще не в первый раз листинг на бейсике видела.... unsure.gif
klem4
Сейчас попробую перевести на паскаль, заняться нечем .. но мне почему-то кажется что это не совсем то, что тебе нужно.
klem4
Хм вроде перевел с горем пополам, но что-то я не догоняю, программ практически при любых данных выдает один и тот-же результат, хотя возможно где-то я и ошибся :

Добавлено : гыгы надо просто ф-ю поменять ;)
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.
Jill
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

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

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

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

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

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

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

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

хотя маткад решает...
volvo
Приведи данные, которые ты вводишь в программу, и у тебя возникает ошибка... Только не надо говорить "любые" - меня интересует, что ТЫ вводишь...
Jill
ок, volvo, я поняла smile.gif

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

willhunting
Я написал прогу, но она не работает.
Вот алгоритм: АХ=В- исходная система, Х=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.


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

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


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

А метод Ньютона где можно найти ?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.