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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 20:06   #1
manbo
Новичок
Джуниор
 
Регистрация: 29.11.2011
Сообщений: 1
По умолчанию Решение СНЛ указанными методами (Pascal)

Здравствуйте, уважаемые форумчане. Пишу на подобный форум первый раз, поэтому сильно не ругайтесь на ошибки - буду исправляться.
Для начала условие задачи:
Решить систему нелинейных уравнений f(x)=0 (где f(x)=(f1(x1..xn),f2(x1..xn)...fn(x1 ..xn)) методом по координатного спуска (последовательных решений)*, каждое уравнение решать методом секущих.

*-про этот метод я много где искал, но преподаватель говорит, что я нахожу формулировку этого метода не такую, о которой он думает, хотя называет этот метод именно так.
В этом вся загвоздка - преподаватель объяснил метод своими словами, код которого я вставлю ниже, но т.к. нигде я не могу встретить этот метод я не могу подобрать пример для которого этот метод будет работать.
Чтобы быстрее понять суть моей писанины я напишу по какому алгоритму я его делал:
в тексте программы заданы функции, на входе вводятся точность, шаг и начальное приближение. затем идет вычисление этими методами и на выходе ответ.
А теперь метод:
цикл начинается с первой функции в системе. мы фиксируем все переменные кроме первой (для второй функции в системе будем фиксировать все кроме второй и т.д.). затем в начальном приближении изменяем первое значение на h и считаем функцию от этого начального приближения, потом от -h, потом от 2h, потом -2h и так до тех пор пока функция не поменяет знак. как только функция поменяла знак то мы запускаем метод секущих для последнего полученного результат и предшествующего ему (т.к. для метода секущих нужно 2 приближения чтобы найти следующее).
после секущих получили некоторое новое начальное приближение. с ним начинаем работать уже во второй функции. после проделанных операций мы получили новой начальное приближение, которое мы проверяем чтобы разность его и предшествующего ему было меньше заданной точности, если не выполняется, то повторяем, иначе - ответ.

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

в общем помогите мне найти ошибку в тексте программы или подскажите ссылку на этот метод. Спасибо!
программа для двух уравнений системы:
Код:
Program MKK;
Uses crt;
const n=2;
type mass1=array[1..n] of real;
var          i,j,kol:integer;
  sf,eps,h,h1,s,temph,t1,t2:real;
           x0,x1:mass1;
         tmp,x01:mass1;

function f(nom:integer;x:mass1):real;
      begin
         case nom of
           1 :  f:=x[1]+x[2]-1;
           2 :  f:=x[1]-x[2]-1;
           end;
      end;

procedure sekush(nom:integer; var q0,q1:mass1);
       var l:integer;p,q,temp:real;
       begin
           p:=q1[nom]-q0[nom];
           temp:=f(nom,q1)/(f(nom,q1)-f(nom,q0));
           q1[nom]:=q1[nom]-p*temp;
           q0[nom]:=q;
           end;
       end;

{   -*-   }
{ nachalo }
{   -*-   }
begin
clrscr;

write('       tochnost: '); readln(eps);
write('       shag    : '); readln(h);
temph:=h;
for i:=1 to n do begin
write('priblizenie (',i,')? ');read(x0[i]); end;
s:=0;kol:=0;
repeat
       for j:=1 to n do tmp[j]:=x0[j];
       for i:=1 to n do
           begin
              writeln('functia nomer: ',i,'------------------');
              h1:=temph;
              sf:=f(i,x0);

              for j:=1 to n do  x1[j]:=x0[j];
              for j:=1 to n do  x01[j]:=x0[j];
              repeat
                
                  x1[i]:=x1[i]-h;
                  x01[i]:=x01[i]+h;
                  

                  t1:=f(i,x01);
                  t2:=f(i,x1);
                 
                  h1:=h1+temph;
                  if h1>10000 then begin writeln('shag > 10 000  '); halt end
              until (sf*t1<=0) or (sf*t2<=0);
              if sf*t1<=0 then begin x0[i]:=x01[i]-h; x1[i]:=x01[i]; end
                              else
                              x0[i]:=x1[i]+h;
            
              writeln('x0[',i,']= ',x0[i]:0:3,'x1[',i,']= ',x1[i]:0:3);
              sekush(i,x0,x1);
              writeln('x0[',i,']= ',x0[i]:0:3,'x1[',i,']= ',x1[i]:0:3);
              for j:=1 to n do x0[j]:=x1[j];
           end;
       for j:=1 to n do x1[j]:=tmp[j];
       for j:=1 to n do
         begin
            tmp[j]:=abs(x1[j]-x0[j]);
            s:=s+tmp[j];
         end;
         inc(kol);
until s<eps;
{vivod otveta} for i:=1 to n do writeln('otvet: ',x0[i]:0:3);
end.

Последний раз редактировалось manbo; 29.11.2011 в 20:09.
manbo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Решение системы нелинейных уравнений методами Ньютона и простых итераций. Помогите найти ошибку! Sianessa Помощь студентам 8 13.04.2012 17:32
Решение систем линейных уравнений численными методами. Spyke Паскаль, Turbo Pascal, PascalABC.NET 7 02.10.2011 17:46
Решение дифф.уравнений 2го порядка явным и неявным методами Эйлера ogion Помощь студентам 4 16.05.2010 18:36
Как заставить браузер печатать с указанными BGCOLOR? Stilet HTML и CSS 3 01.10.2009 19:25