Mat-1.192 Numeerinen ja symbolinen laskenta

Laplace/Poisson ja Mathematica/Matlab-I/O

Kenrick Bingham
http://www.hut.fi/~kenny/

29.2.1996

Maaritellaan ensin funktio, joka laaskee annetun funktion arvot hilassa ja tallettaa tuloksen tiedostoon "rhs".

Komento LaskeRHS[f, {x, xmin, xmax},{y, ymin, ymax}, n] laskee funktion f(x,y) arvot nxn-hilassa valilla [xmin, xmax]x[ymin, ymax].

Input := 

LaskeRHS[f_, xlist_List, ylist_List, n_Integer]:=
Module[{xsymb,xalku,xloppu,ysymb,yalku,yloppu,A,stream},
  xsymb=xlist[[1]];
  xalku=xlist[[2]];
  xloppu=xlist[[3]];
  xaskel=(xloppu-xalku)/(n-1);
  ysymb=ylist[[1]];
  yalku=ylist[[2]];
  yloppu=ylist[[3]];
  yaskel=(yloppu-yalku)/(n-1);
  A=Table[f /. {xsymb->xalku+i*xaskel, ysymb->yalku+j*yaskel},
          {i,0,n-1}, {j,0,n-1}];
  Needs["Utilities`BinaryFiles`"];
  stream = OpenWriteBinary["rhs"];
  WriteBinary[stream, N[Transpose[A]]];
  Close[stream];
  MatrixForm[N[A]]
];

Lasketaan funktion f(x,y)=xy arvot 11x11-hilassa valilla [1, 2]x[1, 2]:

Input := 

LaskeRHS[x y, {x,1,2}, {y,1,2}, 11]
Output =

1.     1.1    1.2    1.3    1.4    1.5    1.6    1.7    1.8    1.9    2.

1.1    1.21   1.32   1.43   1.54   1.65   1.76   1.87   1.98   2.09   2.2

1.2    1.32   1.44   1.56   1.68   1.8    1.92   2.04   2.16   2.28   2.4

1.3    1.43   1.56   1.69   1.82   1.95   2.08   2.21   2.34   2.47   2.6

1.4    1.54   1.68   1.82   1.96   2.1    2.24   2.38   2.52   2.66   2.8

1.5    1.65   1.8    1.95   2.1    2.25   2.4    2.55   2.7    2.85   3.

1.6    1.76   1.92   2.08   2.24   2.4    2.56   2.72   2.88   3.04   3.2

1.7    1.87   2.04   2.21   2.38   2.55   2.72   2.89   3.06   3.23   3.4

1.8    1.98   2.16   2.34   2.52   2.7    2.88   3.06   3.24   3.42   3.6

1.9    2.09   2.28   2.47   2.66   2.85   3.04   3.23   3.42   3.61   3.8

2.     2.2    2.4    2.6    2.8    3.     3.2    3.4    3.6    3.8    4.

Tassa valissa kaydaan Matlabissa laskemassa ratkaisu ja tallettamassa se tiedostoon "ratkaisu". Sitten luetaan ratkaisu Mathematicaan, tehdaan siita matriisi ja piirretaan korkeuskayrakuva.

Input := 

Needs["Utilities`BinaryFiles`"];
ratkaisu=Partition[ReadListBinary["ratkaisu",Double],11];
N[ratkaisu,2]//MatrixForm
Output =

0      0      0      0      0      0      0      0      0      0      0

0      0.21   0.35   0.46   0.53   0.57   0.57   0.53   0.44   0.28   0

0      0.35   0.62   0.81   0.93   1.     1.     0.93   0.76   0.47   0

0      0.46   0.81   1.1    1.2    1.3    1.3    1.2    0.98   0.59   0

0      0.53   0.93   1.2    1.4    1.5    1.5    1.4    1.1    0.68   0

0      0.57   1.     1.3    1.5    1.6    1.6    1.5    1.2    0.73   0

0      0.57   1.     1.3    1.5    1.6    1.6    1.5    1.2    0.74   0

0      0.53   0.93   1.2    1.4    1.5    1.5    1.4    1.1    0.7    0

0      0.44   0.76   0.98   1.1    1.2    1.2    1.1    0.95   0.6    0

0      0.28   0.47   0.59   0.68   0.73   0.74   0.7    0.6    0.39   0

0      0      0      0      0      0      0      0      0      0      0
Input := 

ListContourPlot[ratkaisu];