Новичок
Профиль
Группа: Участник
Сообщений: 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(...);
}
//---------------------------------------------------------------------------
|
Так вся программа может выглядеть, но могут быть о ошибки. В /* ... */ закоментирован код Дельфи.
|