Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Система нелинейных уравнений, Помогите найти алгоритмрешения 
:(
    Опции темы
pandrej
Дата 29.11.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.11.2005

Репутация: нет
Всего: нет



Срочно нужна программа на С++ или алгоритм решения системы из 3-х нелинейных уравнений!
Помогите найти, уже везде обыскался! Есть только для решения системы линейных уравнений и для решения нелинейного уравнения. Больше ничего не нашел!
Хотя вот нашел одну прогу на паскале! Может кто-нить поможет ее перевести на С++
Код

{******************************************************************************

Решение систем нелинейных уравнений (СНУ)
Метод Ньютона                         v. 1.0

(c) 2002 Станислав Комов   <[email protected]>

Программисты Корабелки  http://vt.spbgmtu.ru

******************************************************************************}

uses crt;

const
   MAX_SIZE=20;                          {максимальный размер матрицы}

type
   TMatrix = array [1..MAX_SIZE] of array [1..MAX_SIZE] of double;
   TVector = array [1..MAX_SIZE] of double;
   TList = array [1..MAX_SIZE] of integer;
var
   sigma: double;
   max_step: longint;
   xs, xr: TVector;
   n: integer;

{копирование матрицы}
procedure copyMatrix(var a: TMatrix;
                     var b: TMatrix;
                     n: integer);
var
   i, j: integer;
begin
   for i:=1 to n do begin
      for j:=1 to n do begin
         b[i,j] := a[i,j];
      end;
   end;
end;


{печать вектора}
procedure writeVector(var v: TVector;
                      n: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      writeln(v[i]:10:4);
   end;
end;


{получние строки из матрицы матрицы}
procedure getRowFromMatrix(var a: TMatrix;
                           var v: TVector;
                           n: integer;
                           i: integer);
var
   j: integer;
begin
   for j:=1 to n do begin
      v[j] := a[i][j];
   end
end;


{получение столбца из матрицы матрицы}
procedure getColFromMatrix(var a: TMatrix;
                           var v: TVector;
                           n: integer;
                           j: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      v[i] := a[i][j];
   end
end;


{обмен строк матрицы}
procedure swapRow(var a: TMatrix;
                  n: integer;
                  i1: integer;
                  i2: integer);
var
   j: integer;
   t: double;
begin
   for j:=1 to n do begin
      t := a[i1,j];
      a[i1,j] := a[i2,j];
      a[i2,j] := t;
   end
end;


{обмен столбцов матрицы}
procedure swapCol(var a: TMatrix;
                  n: integer;
                  j1: integer;
                  j2: integer);
var
   i: integer;
   t: double;
begin
   for i:=1 to n do begin
      t := a[i,j2];
      a[i,j2] := a[i,j1];
      a[i,j1] := t;
   end
end;


{вычисление обратной матрицы методом Жордана-Гаусса}
procedure inverseJordan(var cs: TMatrix;
                        var c: TMatrix;
                        n: integer);
var
   list_i1: TList;
   list_i2: TList;
   lead_row: TVector;
   lead_col: TVector;
   lp, j1, j2: integer;
   max, t, lead: double;
   max_i, i, j, k: integer;

begin
   copyMatrix(cs,c,n);

   lp := 1;

   {выбор ведущего элемента по столбцу}
   for k:=1 to n do begin
      {поиск максимального по модулю элемента по столбцу}
      max := -1e300;
      max_i := -1;

      for i:=k to n do begin
     if(abs(c[i,k]) > max) then begin
        max := abs(c[i,k]);
        max_i := i;
     end;
      end;

      if(max_i = -1) then begin
     writeln('Ошибка: определитель равен нулю');
      end
      else begin
     {если максимальный элемент не является диагональным - обмен строк}
     if(max_i <> k) then begin

            swapRow(c,n,max_i,k);

        list_i1[lp] := k;
        list_i2[lp] := max_i;
        lp := lp+1;
     end;
      end;

      {построение новой матрицы}
      lead := c[k,k];

      getColFromMatrix(c,lead_col,n,k);
      getRowFromMatrix(c,lead_row,n,k);

      c[k,k] := 1.0/lead;

      for i:=1 to n do begin
     if(i <> k) then begin
        c[i,k] := lead_col[i]/lead;
         end;
      end;

      for j:=1 to n do begin
     if(j <> k) then begin
        c[k,j] := -lead_row[j]/lead;
         end;
      end;

      for i:=1 to n do begin
        for j:=1 to n do begin
        if((i <> k) and (j<>k)) then begin
           c[i,j] := c[i,j]-lead_col[i]/lead*lead_row[j];
            end;
         end;
      end;
   end;

   {обмен столбцов}
   while(lp>1) do begin

      lp := lp-1;
      j1 := list_i1[lp];
      j2 := list_i2[lp];

      swapCol(c,n,j1,j2);
   end;
end;


{норма}
function norma(var v: TVector;
               n: integer): double;
var
   i: integer;
   res: double;
begin
   res := 0;

   for i:=1 to n do begin
      res := res+v[i]*v[i];
   end;

   norma := sqrt(res);
end;


{значения функций}
procedure f(var x: TVector;
            var res: TVector);
begin
   res[1] := x[1]*x[1]+x[2]-2;
   res[2] := x[1]+x[2]*x[2]-4;
end;


{матрица Якоби - матрица частных производных}
procedure jakobi(var x: TVector;
                 var j: TMatrix);
begin
   j[1,1] := 2*x[1];
   j[1,2] := 1;
   j[2,1] := 1;
   j[2,2] := 2*x[2];
end;

{разность векторов}
procedure subVector(var v1: TVector;
                    var v2: TVector;
                    var r: TVector;
                    n: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      r[i] := v1[i]-v2[i];
   end;
end;


{произведение матрицы на вектор}
procedure multMatrixVector(var a: TMatrix;
                           var v: TVector;
                           var r: TVector;
                           n: integer);
var
   i, j: integer;
   res: double;

begin
   for i:=1 to n do begin
      res := 0;
      for j:=1 to n do begin
         res := res+a[i,j]*v[j];
      end;
      r[i] := res;
   end;
end;


{копирование вектора}
procedure copyVector(var v: TVector;
                     var r: TVector;
                     n: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      r[i] := v[i];
   end;
end;



{решение системы нелинейных уравнений методом Ньютона}
procedure nonLinSystemNewton(var xs: TVector;     {нач. приближение}
                             var x: TVector;      {результат}
                             n: integer;          {размер}
                             sigma: double;       {точность}
                 max_step: longint);  {макс. кол-во шагов}
var
   f_v, d: TVector;
   j, j_inv: TMatrix;
   k: longint;

begin
   copyVector(xs,x,n);

   for k:=1 to max_step do begin
      jakobi(x,j);
      inverseJordan(j,j_inv,n);           {обращение матрицы Якоби}

      f(x,f_v);

      multMatrixVector(j_inv,f_v,d,n);
      subVector(x,d,x,n);                   {новое приближение}

      if(norma(f_v,n) < sigma) then exit; {проверка на окончание вычислений}
   end;

   writeln('Число шагов: ',k);

   if(k = max_step) then writeln('Заданная точность не достигнута');
end;


begin
   clrscr;

   sigma := 0.000001;
   max_step := 10000;
   n := 2;
   xs[1] := 1;
   xs[2] := 1;

   writeln('Решение системы нелинейных уравнений');
   writeln('Метод Ньютона');
   writeln('Начальное значение x:');
   writeVector(xs,n);
   writeln('Погрешность: ',sigma);
   writeln('Максимальное число шагов: ',max_step);
   nonLinSystemNewton(xs, xr, n, sigma, max_step);
   writeln('Решение системы:');
   writeVector(xr,n);

   readKey;
end.


PM MAIL   Вверх
amium
Дата 2.12.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



Код



const int MAX_SIZE=20;                        //  {максимальный размер матрицы}



typedef double TMatrix[MAX_SIZE][MAX_SIZE] ;
typedef double TVector [MAX_SIZE];
typedef int TList[MAX_SIZE];

double sigma;
long max_step;
TVector xs, xr;
int n;

//{копирование матрицы}
void copyMatrix(TMatrix &a, TMatrix &b,int n)
{
   int i, j;
   for (i=0;j<n;i++)
      for (j=0;j<n;j++)
         b[i][j] = a[i][j];
}

/*
//{печать вектора}
void writeVector(TVector &v,int n)
{
int  i;
   for (i=0;i<n;i++)
      printf(v[i]....);
}*/

//{получние строки из матрицы матрицы}
void getRowFromMatrix(TMatrix &a,TVector &v, int n, int i){
int j;
   for(j=0; j<n;j++){
      v[j] = a[i][j];
   }
}


void getColFromMatrix(TMatrix &a,TVector &v, int n, int j){
int i;
   for(i=0; i<n;i++){
      v[i] = a[i][j];
   }
}


//{обмен строк матрицы}
void swapRow(TMatrix &a,
                  int n,
                  int i1,
                  int i2)
{
int j;
double t;
   for(j=0; j<n;j++){
      t = a[i1][j];
      a[i1][j] = a[i2][j];
      a[i2][j] = t;
   }
}



//{обмен столбцов матрицы}
void swapRow(TMatrix &a,
                  int n,
                  int i1,
                  int i2)
{
int j;
double t;
   for(i=0;  n ){
      t = a[i][j2];
      a[i][j2] = a[i][j1];
      a[i][j1] = t;
   }
}



//{вычисление обратной матрицы методом Жордана-Гаусса}
void inverseJordan(TMatrix &cs,
                         TMatrix &c,
                         int n)
{
TList list_i1, list_i2;
TVector lead_row, lead_col;
int lp, j1, j2;
double max, t, lead;
int max_i, i, j, k;

   copyMatrix(cs,c,n);

   lp = 1;

//   {выбор ведущего элемента по столбцу}
   for(k=1;k<n;k++){
      {поиск максимального по модулю элемента по столбцу}
      max := -1E+300;
      max_i := -1;

      for(i=k; i<n; i++){
         if(abs(c[i,k]) > max){
            max := abs(c[i,k]);
            max_i := i;
         }
      }

      if(max_i == -1){
//         writeln('Ошибка: определитель равен нулю');
      }else{
//    {если максимальный элемент не является диагональным - обмен строк}
     if(max_i <> k){
        swapRow(c,n,max_i,k);
        list_i1[lp] = k;
        list_i2[lp] = max_i;
        lp = lp+1;
     }
     }

     // {построение новой матрицы}
      lead = c[k][k];

      getColFromMatrix(c,lead_col,n,k);
      getRowFromMatrix(c,lead_row,n,k);

      c[k][k] := 1.0/lead;

      for(i=1; i<n;i++){
         if(i != k){
           c[i][k] = lead_col[i]/lead;
         } 
      }

      for(j=1;j<n;j++){
       if(j != k)
          c[k][j] := -lead_row[j]/lead;
      }

      for(i=1;i<n;++i)
        for(j=1;j<n;j++)
          if(i != k && j != k){
           c[i][j] := c[i][j]-lead_col[i]/lead*lead_row[j];
          }
   }

//   {обмен столбцов}
   while(lp>1){

      lp = lp-1;
      j1 = list_i1[lp];
      j2 = list_i2[lp];

      swapCol(c,n,j1,j2);
   }
}

///////////////////////


Первая половина может выглядеть так... smile

PM MAIL   Вверх
pandrej
Дата 5.12.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.11.2005

Репутация: нет
Всего: нет



Спасибо конечно же, но как же все-таки дальше!
Первая часть кода простая, меня больше волнует продолжение! Пожалуйста, кто может напишите!
PM MAIL   Вверх
amium
Дата 5.12.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



Код

//---------------------------------------------------------------------------
/*{******************************************************************************

Šåųåķčå ńčńņåģ ķåėčķåéķūõ óšąāķåķčé (ŃĶÓ)
Ģåņīä Ķüžņīķą                         v. 1.0

(c) 2002 Ńņąķčńėąā Źīģīā   <[email protected]>

Ļšīćšąģģčńņū Źīšąįåėźč  http://vt.spbgmtu.ru

******************************************************************************}

*/


#include <stdio>
#include <math>

#include "nonlinear.h"


const int MAX_SIZE=20;                        //  {ģąźńčģąėüķūé šąēģåš ģąņščöū}



typedef double TMatrix[MAX_SIZE][MAX_SIZE] ;
typedef double TVector [MAX_SIZE];
typedef int TList[MAX_SIZE];

double sigma;
long max_step;
TVector xs, xr;
int n;

//{źīļčšīāąķčå ģąņščöū}
void copyMatrix(TMatrix &a, TMatrix &b,int n)
{
   int i, j;
   for (i=0;j<n;i++)
      for (j=0;j<n;j++)
         b[i][j] = a[i][j];
}


//{ļå÷ąņü āåźņīšą}
void writeVector(TVector &v,int n)
{
int  i;
   for (i=0;i<n;i++)
      printf("%e",v[i]);
}

//{ļīėó÷ķčå ńņšīźč čē ģąņščöū ģąņščöū}
void getRowFromMatrix(TMatrix &a,TVector &v, int n, int i){
int j;
   for(j=0; j<n;j++){
      v[j] = a[i][j];
   }
}


void getColFromMatrix(TMatrix &a,TVector &v, int n, int j){
int i;
   for(i=0; i<n;i++){
      v[i] = a[i][j];
   }
}


//{īįģåķ ńņšīź ģąņščöū}
void swapRow(TMatrix &a,
                  int n,
                  int i1,
                  int i2)
{
int j;
double t;
   for(j=0; j<n;j++){
      t = a[i1][j];
      a[i1][j] = a[i2][j];
      a[i2][j] = t;
   }
}



//{īįģåķ ńņīėįöīā ģąņščöū}
void swapCol(TMatrix &a,
                  int n,
                  int j1,
                  int j2)
{
int i;
double t;
   for(i=0;i<n;i++){
      t = a[i][j2];
      a[i][j2] = a[i][j1];
      a[i][j1] = t;
   }
}



//{āū÷čńėåķčå īįšąņķīé ģąņščöū ģåņīäīģ Ęīšäąķą-Ćąóńńą}
void inverseJordan(TMatrix &cs,
                         TMatrix &c,
                         int n)
{
TList list_i1, list_i2;
TVector lead_row, lead_col;
int lp, j1, j2;
double max, t, lead;
int max_i, i, j, k;

   copyMatrix(cs,c,n);

   lp = 1;

//   {āūįīš āåäółåćī żėåģåķņą ļī ńņīėįöó}
   for(k=1;k<n;k++){
      //{ļīčńź ģąźńčģąėüķīćī ļī ģīäóėž żėåģåķņą ļī ńņīėįöó}
      max = -1E+300;
      max_i = -1;

      for(i=k; i<n; i++){
         if(abs(c[i][k]) > max){
            max = abs(c[i][k]);
            max_i = i;
         }
      }

      if(max_i == -1){
//         writeln('Īųčįźą: īļšåäåėčņåėü šąāåķ ķóėž');
      }else{
//    {åńėč ģąźńčģąėüķūé żėåģåķņ ķå ˙āė˙åņń˙ äčąćīķąėüķūģ - īįģåķ ńņšīź}
     if(max_i != k){
        swapRow(c,n,max_i,k);
        list_i1[lp] = k;
        list_i2[lp] = max_i;
        lp = lp+1;
     }
     }

     // {ļīńņšīåķčå ķīāīé ģąņščöū}
      lead = c[k][k];

      getColFromMatrix(c,lead_col,n,k);
      getRowFromMatrix(c,lead_row,n,k);

      c[k][k] = 1.0/lead;

      for(i=1; i<n;i++){
         if(i != k){
           c[i][k] = lead_col[i]/lead;
         }
      }

      for(j=1;j<n;j++){
       if(j != k)
          c[k][j] = -lead_row[j]/lead;
      }

      for(i=1;i<n;++i)
        for(j=1;j<n;j++)
          if(i != k && j != k){
           c[i][j] = c[i][j]-lead_col[i]/lead*lead_row[j];
          }
   }

//   {īįģåķ ńņīėįöīā}
   while(lp>1){

      lp = lp-1;
      j1 = list_i1[lp];
      j2 = list_i2[lp];

      swapCol(c,n,j1,j2);
   }
}

/*
{ķīšģą}
function norma(var v: TVector;
               n: integer): double;
var
   i: integer;
   res: double;
begin
   res := 0;

   for i:=1 to n do begin
      res := res+v[i]*v[i];
   end;

   norma := sqrt(res);
end;
*/

//{ķīšģą}
double norma(TVector &v,int n)
{
int i;
double res;
   res = 0;

   for(i=0;i<n;i++)
      res = res+v[i]*v[i];

   return sqrt(res);
}

/*
{ēķą÷åķč˙ ōóķźöčé}
procedure f(var x: TVector;
            var res: TVector);
begin
   res[1] := x[1]*x[1]+x[2]-2;
   res[2] := x[1]+x[2]*x[2]-4;
end;
*/

//{ēķą÷åķč˙ ōóķźöčé}
void f(TVector &x,TVector &res){
   res[1] = x[1]*x[1]+x[2]-2;
   res[2] = x[1]+x[2]*x[2]-4;
}

/*
{ģąņščöą ßźīįč - ģąņščöą ÷ąńņķūõ ļšīčēāīäķūõ}
procedure jakobi(var x: TVector;
                 var j: TMatrix);
begin
   j[1,1] := 2*x[1];
   j[1,2] := 1;
   j[2,1] := 1;
   j[2,2] := 2*x[2];
end;
*/

//{ģąņščöą ßźīįč - ģąņščöą ÷ąńņķūõ ļšīčēāīäķūõ}
void jakobi(TVector &x,TMatrix &j)
{
   j[1][1] = 2*x[1];
   j[1][2] = 1;
   j[2][1] = 1;
   j[2][2] = 2*x[2];
}

/*
{šąēķīńņü āåźņīšīā}
procedure subVector(var v1: TVector;
                    var v2: TVector;
                    var r: TVector;
                    n: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      r[i] := v1[i]-v2[i];
   end;
end;
*/


//{šąēķīńņü āåźņīšīā}
void subVector(TVector &v1,
               TVector &v2,
               TVector &r,
               int n)
{
int i;
   for(i=0;i<n;i++)
      r[i] = v1[i]-v2[i];
}



/*
{ļšīčēāåäåķčå ģąņščöū ķą āåźņīš}
procedure multMatrixVector(var a: TMatrix;
                           var v: TVector;
                           var r: TVector;
                           n: integer);
var
   i, j: integer;
   res: double;

begin
   for i:=1 to n do begin
      res := 0;
      for j:=1 to n do begin
         res := res+a[i,j]*v[j];
      end;
      r[i] := res;
   end;
end;
*/



//{ļšīčēāåäåķčå ģąņščöū ķą āåźņīš}
void multMatrixVector(TMatrix &a,
                      TVector &v,
                      TVector &r,
                      int n)
{
int i, j;
double res;
   for(i=0;i<n;i++){
      res = 0;
      for(j=0;j<n;j++){
         res = res+a[i][j]*v[j];
      }
      r[i] = res;
   }
}



/*
{źīļčšīāąķčå āåźņīšą}
procedure copyVector(var v: TVector;
                     var r: TVector;
                     n: integer);
var
   i: integer;
begin
   for i:=1 to n do begin
      r[i] := v[i];
   end;
end;
*/


//{źīļčšīāąķčå āåźņīšą}
void copyVector(TVector &v,
                TVector &r,
        int n)
{
int i;

   for(i=0;i<n;i++)
      r[i] = v[i];
}



/*
{šåųåķčå ńčńņåģū ķåėčķåéķūõ óšąāķåķčé ģåņīäīģ Ķüžņīķą}
procedure nonLinSystemNewton(var xs: TVector;     {ķą÷. ļščįėčęåķčå}
                             var x: TVector;      {šåēóėüņąņ}
                             n: integer;          {šąēģåš}
                             sigma: double;       {ņī÷ķīńņü}
                 max_step: longint);  {ģąźń. źīė-āī ųąćīā}
var
   f_v, d: TVector;
   j, j_inv: TMatrix;
   k: longint;

begin
   copyVector(xs,x,n);

   for k:=1 to max_step do begin
      jakobi(x,j);
      inverseJordan(j,j_inv,n);           {īįšąłåķčå ģąņščöū ßźīįč}

      f(x,f_v);

      multMatrixVector(j_inv,f_v,d,n);
      subVector(x,d,x,n);                   {ķīāīå ļščįėčęåķčå}

      if(norma(f_v,n) < sigma) then exit; {ļšīāåšźą ķą īźīķ÷ąķčå āū÷čńėåķčé}
   end;

   writeln('×čńėī ųąćīā: ',k);

   if(k = max_step) then writeln('Ēąäąķķą˙ ņī÷ķīńņü ķå äīńņčćķóņą');
end;
*/


//{šåųåķčå ńčńņåģū ķåėčķåéķūõ óšąāķåķčé ģåņīäīģ Ķüžņīķą}
void nonLinSystemNewton(TVector &xs,   //  {ķą÷. ļščįėčęåķčå}
                             TVector &x,   //   {šåēóėüņąņ}
                             int n,        //  {šąēģåš}
                             double sigma,      // {ņī÷ķīńņü}
                             long max_step) // {ģąźń. źīė-āī ųąćīā}
{
  TVector f_v, d ;
  TMatrix j, j_inv ;
  long k;

   copyVector(xs,x,n);

   for(k=0;k<max_step;k++){
      jakobi(x,j);
      inverseJordan(j,j_inv,n);          // {īįšąłåķčå ģąņščöū ßźīįč}

      f(x,f_v);

      multMatrixVector(j_inv,f_v,d,n);
      subVector(x,d,x,n);                 // {ķīāīå ļščįėčęåķčå}

      if(norma(f_v,n) < sigma) return;  // {ļšīāåšźą ķą īźīķ÷ąķčå āū÷čńėåķčé}
   }

   printf("×čńėī ųąćīā: %d\n",k);

   if(k == max_step) printf("Ēąäąķķą˙ ņī÷ķīńņü ķå äīńņčćķóņą");
}



/*
begin
   clrscr;

   sigma := 0.000001;
   max_step := 10000;
   n := 2;
   xs[1] := 1;
   xs[2] := 1;
   
   writeln('Šåųåķčå ńčńņåģū ķåėčķåéķūõ óšąāķåķčé');
   writeln('Ģåņīä Ķüžņīķą');
   writeln('Ķą÷ąėüķīå ēķą÷åķčå x:');
   writeVector(xs,n);
   writeln('Ļīćšåųķīńņü: ',sigma);
   writeln('Ģąźńčģąėüķīå ÷čńėī ųąćīā: ',max_step);
   nonLinSystemNewton(xs, xr, n, sigma, max_step);
   writeln('Šåųåķčå ńčńņåģū:');
   writeVector(xr,n);

   readKey;

end.
*/

void mymain(){
   //clrscr;

   sigma = 0.000001;
   max_step = 10000;
   n = 2;
   xs[1] = 1;
   xs[2] = 1;


   printf("Šåųåķčå ńčńņåģū ķåėčķåéķūõ óšąāķåķčé");
   printf("Ģåņīä Ķüžņīķą");
   printf("Ķą÷ąėüķīå ēķą÷åķčå x:");
   writeVector(xs,n);
   printf("Ļīćšåųķīńņü: ",sigma);
   printf("Ģąźńčģąėüķīå ÷čńėī ųąćīā: %d",max_step);
   nonLinSystemNewton(xs, xr, n, sigma, max_step);
   printf("Šåųåķčå ńčńņåģū:");
   writeVector(xr,n);

   getc(stdin);
   //scanf(...);

}



//---------------------------------------------------------------------------




Так вся программа может выглядеть, но могут быть о ошибки.

В /* ... */ закоментирован код Дельфи.
PM MAIL   Вверх
pandrej
Дата 5.12.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.11.2005

Репутация: нет
Всего: нет



спасибо большое, я попробую!
PM MAIL   Вверх
Ura20007
Дата 28.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 22.4.2007

Репутация: нет
Всего: 1



Ребятки а метод секущих исходник у кого-нибудь есть для решения системы нелинейных уравнений(для 2 уравнений).

Заранее спасибо.
PM MAIL   Вверх
Danza
Дата 28.12.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 11.12.2007
Где: Krasnodar

Репутация: нет
Всего: нет



Решение системы нелинейных уравнений методом Якоби, но для двух ур-ий.
Код

#include "stdafx.h"
#include "math.h"
#include "time.h" 
#include <iostream>
using namespace std;
const double eps=0.00001; 
//double

double norm (double x0, double x1, double y0, double y1);
double f(double x, double y);
double g(double x, double y);
double pr_fx(double x, double y);
double pr_gy(double x, double y);
double nutonx(double y0);
double nutony(double x0);


int _tmain(int argc, _TCHAR* argv[])
{
    double x, xnext, y, ynext;
    int t=1;
    int n=0, m=0;
    x=2.5; y=4.5;  // начальное приближение
    //srand(time(NULL));    
    while (t!=0)
    {
        xnext=nutonx(y);
        //cout<<xnext<<endl;
        ynext=nutony(x);
        //cout<<ynext<<endl;
        n++;
        if (norm(x, xnext, y, ynext)<eps) t=0;
        //if (n==65000){ n=0; m++;}
        //if (m==3) t=0;
        if (n==65000) t=0;
        x=xnext;
        y=ynext;
    }
    cout<<"x="<<x<<"\ty="<<y<<"\nn="<<n<<"\nm="<<m<<endl;;
    system("pause");
    return 0;
}


double norm (double x0, double x1, double y0, double y1)
{
    return /*abs(x0-y0)+abs(x1-y1);//*/sqrt( (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1) );
}
double f(double x, double y)
{
    return /*sin(x)+cos(y-1)-1; //*/x*x-y-4;//y-x*x;
}
double g(double x, double y)
{
    return /*10*x-7*y+7;//*/x+2*y-13;//y-x*x/2-2;
}
 double pr_fx(double x, double y) 
 { 
  double t; 
  t=(f(x+eps, y)-f(x-eps, y))/eps; 
  return t; 
  } 
 double pr_gy(double x, double y)
 { 
  double t; 
  t=(f(x, y+eps)-f(x, y-eps))/eps; 
  return t; 
  } 
  double nutonx(double y0 ) 
 { double x1=rand () % 20; 
  while (abs(f(x1, y0))>eps) 
         x1=x1-f(x1,y0)/pr_fx(x1,y0);                 
        return x1; 
 } 
    double nutony(double x0) 
 {
        double y1=rand () %20;
  while (abs(g(x0, y1))>eps) 
         y1=y1-g(x0, y1)/pr_gy(x0, y1);                 
        return y1; 
 } 

Допиши сюда ещё одну функцию, функцию для поиска частной производной по z, nutonZ мона написать аналогично предыдущему и в процедуру norm надо добавть будет под корень ещё (z0-z1)*(z0-z1). По идее, должно работать.
PM MAIL ICQ   Вверх
Ura20007
Дата 29.12.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 22.4.2007

Репутация: нет
Всего: 1



Так мне нужен метод секущих!!! 
PM MAIL   Вверх
Ura20007
Дата 30.12.2007, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 22.4.2007

Репутация: нет
Всего: 1



Ребятки выручьте пожалуйста
PM MAIL   Вверх
Ura20007
Дата 12.1.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 22.4.2007

Репутация: нет
Всего: 1



Ребята помогите хотя бы алгоритмом
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1154 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.