На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> метод итерации.... , подскажите....
    подскажите програмную реализацию (если можно то на Turbo Pascale, хотя можно и на С, вообщем без разницы....) метода итераций для заданного уравнения, известен также и отрезок в котором содержится корень.... я читал теорию по этому методу, ну че то меня конкретно стопарнуло, и я не как не могу сообразить как это сделать.......
      Вот откопал сорец метод итераций для уравнения:
      Цитата
      #include <iostream.h>
      #include <fstream.h>
      #include <conio.h>
      #include <string.h>
      #include <stdio.h>
      #include <math.h>
      #include <stdlib.h>
      #define N 10

      int n;          // Число уравнений
      double x[N];        // Массив переменных
      double A[N][N+1];  // Массив коэффицентов
      int prec;
      double V[N][N];
      double Va[N][N];
      double tmp[N][N+1];
      //double pres;

      int zero(double & a)
      {
      if(fabs(a)<0.0000000001)
      {
        a=0;
        return 1;
      }
      else return 0;
      }

      void store();
      void restore();

      void init();
      void mainel();
      int iter();
      void result(char * title);
      int det();
      void check();

      void store()
      {
      for (int j=0;j<n;j++)
        for (int i=0;i<=n;i++)
        {
        Va[j][i]=A[j][i];
        tmp[j][i]=A[j][i];
        }
      }
      void restore()
      {
      for (int j=0;j<n;j++)
        for (int i=0;i<=n;i++)
        A[j][i]=tmp[j][i];
      }


      void init()  // Инициализация данных системы
      {
      cout << "Введите количество уравнений -> ";
      cin >> n;
      if(n>0)
        gotoxy(5,8);
      cout<<"Введите A"<<endl;
        for (int j=0;j<n;j++)
        for (int i=0;i<n;i++)
        {gotoxy(10+6*j,10+i);
        cout<<"|";
        cin>>A[i][j];}
        gotoxy(50,8);
          cout<<"Введите b"<<endl;
        for (int i=0;i<n;i++)
      { gotoxy(35,10+i);
        cout<<".";
        cin>>A[i][n];
      }


      }
      void mainel() // Метод главных элементов
      {
      int ch,pe[N],qu[N];
      int i,j,l,k,p,o,m=1;
      double max;
      double temp;

      ch=-1;max=-1000;
        for(i=0;i<n;i++)
        pe[i]=qu[i]=-1;

        for(l=0;l<n;l++)    // Цикл нахождения max
        {                        // в нужных матрицах коэффициентов
        for(i=0;i<n;i++)
        {
          for(j=0;j<n;j++)
          {

          for(k=0;k<ch+1;k++)
          {
            if(i==pe[k]||j==qu[k])
            goto jump;
          }

          if(fabs(A[i][j])>max)
          {
            max=A[i][j];
            pe[ch+1]=i;
            qu[ch+1]=j;
          }
          jump:;
          }
        }

        if(l==n-1)
          goto j;


        for(i=0;i<n;i++)      // Цикл преобразования
        {                          // нужных элементов матрицы коэффициентов
          temp=A[i][qu[ch+1]];
          for(j=0;j<n+1;j++)
          {

          for(k=0;k<ch+1;k++)
          {
            if(i==pe[k]||j==qu[k])
            goto jmp;
          }
          if(i==pe[ch+1])          // Главная строка не учитывается
            goto jmp;

          p=pe[ch+1];o=qu[ch+1];
          A[i][j]=A[i][j]-temp/max*A[p][j];  // Преобразование

          jmp:;
          }
        }

        ch++;
        max=-1000;
        j:;
        }

        for(i=0;i<n;i++)
        x[i]=0;
        p=pe[ch+1];o=qu[ch+1];
        x[o]=A[p][n]/A[p][o];

        for(l=ch;l>-1;l--)            // Обратный ход
        {
        for(m=0;m<n;m++)
        {
          if(m==qu[l])
          goto ju;
          x[qu[l]]-=x[m]*A[pe[l]][m];
          ju:;
        }
        x[qu[l]]+=A[pe[l]][n];
        x[qu[l]]=x[qu[l]]/A[pe[l]][qu[l]];
        zero(x[qu[l]]);
        }
      }


      int iter()    // процесс итерации
      {
      double Num[N],temp[N],sum;
      int i,j,k,f,c=0;

      for (i=0;i<n;i++)          // Проверка сходимости
      {
        sum=0;
        for (j=0;j<n;j++)
        if (i!=j) sum+=fabs(A[j][i]);

        if (fabs(A[i][i])<sum)
        {
          cout << "Метод итерации не сходится"<<endl;
          getch();
      return 0;
        }
        }

      cout<<"Введите точность"<<endl;
      double iprec;
      cin>>iprec;
      for(i=0;i<n;i++)        // x[i] - корни системы (нач прибл)
        x[i]=A[i][n]/A[i][i];

        again:;
      for(f=0;f<n;f++)
      {
        temp[f]=x[f];              // temp[f] - старые значение корней
        Num[f]=A[f][n];
      }
        for(i=0;i<n;i++)          // Получение более точных корней
        {
        for(j=0;j<n;j++)
        {
          bg:;
          if(i==j)
          {
          j++;
          if(j>=n)
            goto jm;
          goto bg;
          }
          Num[i]=Num[i]-A[i][j]*temp[j];
        }
        jm:;
        x[i]=Num[i]/A[i][i];
        c++;
        }

      for(k=0;k<n;k++)    // Проверка точности полученных корней
      {
        if( fabs(x[k]-temp[k]) >= iprec )
          goto again;
        if( ( fabs(x[k]-temp[k]) < iprec ) && ( k==n-1 ) )
          break;
      }
      sum=1;
      cout << "Количество итераций == " << c << endl;
      getch();
      return 1;
      }

      void result(char * title)    // Вывод корней на экран
      {
      cout << "Решение системы методом "
            << title << endl;

        for(int i=0;i<n;i++)
        {
      zero(x[i]);
      cout << " x[" << i+1 <<"] = ";
      cout.precision(prec+1);
      cout << x[i];

      cout << " (";
      cout.precision(9);
      cout << x[i] << ")";

      cout << endl;
        }
      }

      int det()  // Расчёт определителя
      {
      int i,j,k,p,o,l;
      double a,rez=1,temp[N];

      for(p=0;p<n;p++)
        for(o=0;o<n+1;o++)
        Va[p][o]=V[p][o]=A[p][o];

      for (k=0;k<n;k++)
      {
      bi:;
        if(zero(V[k][k]))
        {

          for(l=0;l<n+1;l++)
        temp[l]=V[k][l];

          if(k!=n-1)
          {
          for(l=0;l<n+1;l++)
          {
            V[k][l]=V[k+1][l];
            V[k+1][l]=temp[l];
          }
          }
          goto bi;
        }


        rez*=V[k][k];
        a=V[k][k];
        for (j=0;j<n;j++)
        {
          V[k][j]=V[k][j]/a;
        }

        for (i=k+1;i<n;i++)
        {
          double aa=V[i][k];
          for (j=0;j<n;j++)
          V[i][j]-=aa*V[k][j];
        }
        }

      if(n==2)
        rez=A[0][0]*A[1][1]-A[0][1]*A[1][0];

      if(zero(rez))
      {
        cout << "det A=0, система вырождена.";
        getch();
        return 0;
      }
      else
      {
        return 1;
      }
      }

      void check()  // Проверка полученных корней (подстановка в ур-ния системы)
      {
      int i,j;
      double totalerr=0.0;

      for(i=0;i<n;i++)
      {
        double sum=0;
        for(j=0;j<n;j++)
        {
        sum+=Va[i][j]*x[j];
        }
        double err=fabs(sum-Va[i][n]);
        zero(err);
        cout << "  " << sum << " =?= " << Va[i][n] << " / Погр.= " << err << endl;
        totalerr+=fabs(sum-Va[i][n]);
      }
      }
      void main(void)
      {

      clrscr();

      for(;;)
      {
        cout<<"МЕНЮ"<<endl
        <<"1. Ввод данных"<<endl
        <<"2. Метод главных элементов"<<endl
        <<"3. Метод итераций"<<endl
        <<"4. Выход"<<endl;
        switch(getch())
        {
        case '1':
          init();
          break;
        case '2':
          if(!det()) break;
          store();
          mainel();
      result("главных элементов");
          check();
          restore();
          getch();
          break;
        case '3':
      if(!det()) break;
      store();
      if(!iter()) break;
      result("итераций");
      check();
      restore();
      getch();
      break;
        case '4':
          return;
        }
        clrscr();
      }
      }
        спасибо..... но у меня вот какой вопрос появился, возможно ли применить метод итерации не имея матрицы(про то что этот метод реализуется через матрицу я знал), но просто у меня вот такое вот задание - типа есть исходное уравнение, и промежуток в котором оно имеет решение....я уже реализовал метод Ньютона и метод половинного деления для заданных уравнений, а вот метод итераций че то никак не пойму.... может он без матрицы и бесмысленен???! или я просто туплю...
        вот исходный текст задание:
        Решить уравнение - arccos(X) - sqrt(1-0,3*(x*x*x)) = 0 , отрезок содержащий корень на отрезке [0,1] , применив метод итераций......
          из данного уравнения вырази x(т.е у тебя получится x=f(x))

          x0:=1;
          readln(eps);-точность которую надо достичь
          repeat
          x1:=твою функцию
          d:=ads(x0-x1); получаемая точность
          x0:=x1;
          until d<s;

          в x0 приближеннный корень
            на всякий случай
            http://demo-s.by.ru/math.html
              ежели я не ошибаюсь, итерационные методы - ето совершенно необъятный класс методов. или я чегото непонимаю??
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0649 ]   [ 15 queries used ]   [ Generated: 8.10.26, 01:39 GMT ]