境界条件の適用

境界条件はu=g on Γとします。まず
一般論ですが次をご覧ください。
ある連立一次方程式

\begin{pmatrix}a&b&c\\d&e&f\\g&h&i\end{pmatrix}
\begin{pmatrix}x\\y\\z\end{pmatrix}
=
\begin{pmatrix}u\\v\\w\end{pmatrix}
においてxが既知だったとします。すると

\left\{
\begin{split}
a\tilde{x}+by+cz&=u\\
d\tilde{x}+ey+fz&=v\\
g\tilde{x}+hy+iz&=w
\end{split}
\right.
既知項を移行して

\left\{
\begin{split}
by+cz&=u-a\tilde{x}\\
ey+fz&=v-d\tilde{x}\\
hy+iz&=w-g\tilde{x}
\end{split}
\right.
このうち線形独立な式は2本しかないので、一本目を削除します。これを反映させて次のように書くことができます

\begin{pmatrix}1&0&0\\0&e&f\\0&h&i\end{pmatrix}
\begin{pmatrix}x\\y\\z\end{pmatrix}
=
\begin{pmatrix}\tilde{x}\\v-d\tilde{x}\\w-g\tilde{x}\end{pmatrix}
一見煩雑に見えますが、行列構造を変更しなくてよいのでおすすめです。同様にしてAとbを修正していきます

int i,j;//index
double tmp;//一時的な変数です
 
for(i=0;i<non;i++)
 if(bn[i]==1)
  b[i]=g(nbc[i][0],nbc[i][1]);
 
for(i=0;i<non;i++)
 if(bn[i]==0){
  tmp=0;
  for(j=row_ptr[i];j<row_ptr[i+1];j++)
   if(bn[col_ind[j]]==1)
    tmp+=val[j]*b[col_ind[j]];
  b[i]-=tmp;
 }
 
for(i=0;i<non;i++)
 if(bn[i]==1)
  for(j=row_ptr[i];j<row_ptr[i+1];j++)
   if(col_ind[j]==i)
    val[j]=1;
   else
    val[j]=0;
 else
  for(j=row_ptr[i];j<row_ptr[i+1];j++)
   if(bn[col_ind[j]]==1)
    val[j]=0;
 
 

タグ:

+ タグ編集
  • タグ:
最終更新:2010年10月18日 10:31
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。