数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3438|回复: 7

哪位高手把解线形方程的数值算法程序贴一下,小弟拜谢

[复制链接]
发表于 2004-8-3 17:38:04 | 显示全部楼层 |阅读模式
因为要做实习,哪位高手把解线形方程的数值算法程序贴一下,小弟拜谢
发表于 2004-8-4 00:39:04 | 显示全部楼层
<>    求解形如AX=B的线形方程组有直接法和迭代法,直接法有高斯消元法和列主元消元法。迭代法有雅可比迭代法和高斯塞德尔迭代法。</P><>       雅可比迭代法程序                                       高斯塞德尔迭代法程序</P><>function s=jacobi(a,b,x0,eps)                            function s=gauss(a,b,x0,eps) </P><P>    D=diag(diag(a));                                              D=diag(diag(a));</P><P>    D=inv(D);                                                          L=tril(a,-1);</P><P>    L=tril(a,-1);                                                      u=triv(b,1);</P><P>    u=triv(a,1);                                                      B=inv(D+L);</P><P>    B=-D*(L+u);                                                     f=c*b</P><P>     f=D*b;                                                             s=B*x0+f;</P><P>     s=B*x0+f;                                                       while norm(s-x0)&gt;=eps </P><P>     while norm(s-x0)&gt;=eps                                    x0=s;</P><P>      x0=s;                                                               s=B*x0+f;  </P><P>      s=B*x0+f;                                                          end                                          </P><P>     end                                                                          </P><P>return</P><P>                                  </P><P>return</P><P>   </P>
发表于 2004-8-4 09:40:34 | 显示全部楼层
<>//Jacobi  方法,以下是完整的c++程序,把矩阵A存在同目录下的A.txt中,向量b存在同目录下的B.txt中,结果在out.txt中,解得是Ax=b</P><>#include &lt;vector&gt;
#include &lt;math.h&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;</P><>using namespace std;</P><P>ofstream out("out.txt");</P><P>double operator * (vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;it1!=a.end();++it1,++it2)
            {
                   data+=((*it2)*(*it1));
            }
      }
      return data;
}</P><P>double Delta(vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;(it1!=a.end())&amp;&amp;(it2!=b.end());++it1,++it2)
            {
                  if(fabs((*it1)-(*it2))&gt;data)
                  {
                        data=fabs((*it1)-(*it2));
                  }
            }
      }
      return data;
}
                  
vector&lt;double&gt; Jacobi(vector&lt;vector&lt;double&gt; &gt; A,vector&lt;double&gt; B,double delta)
{
      vector&lt;double&gt; x1(B.size(),0);
      vector&lt;double&gt; x2(B.size(),0);
      do
      {
             x2=x1;
             for(int i=0;i&lt;x2.size();++i)
             {
                    double xx=A*x2;
                    xx-=A*x2;
                    x1=(B-xx)/A;
             }
      }while(Delta(x1,x2)&gt;delta);
      return x1;
}</P><P>void Print(vector&lt;double&gt; a)
{
      vector&lt;double&gt; :: iterator it=a.begin();
      for(;it!=a.end();++it)
      {
            cout&lt;&lt;(*it)&lt;&lt;"\t";
            out&lt;&lt;(*it)&lt;&lt;"\t";
      }
      cout&lt;&lt;endl;
      out&lt;&lt;endl;
}</P><P>void Print(vector&lt;vector&lt;double&gt; &gt; A)
{
     for(int i=0;i&lt;A.size();++i)
     {
          Print(A);
     }
}
                    
int main()
{
     ifstream inA("A.txt");
     ifstream inB("B.txt");
     cout&lt;&lt;"Define the dimension of the matrix:"&lt;&lt;endl;
     int num;
     cin&gt;&gt;num;
     vector&lt;vector&lt;double&gt; &gt; A(num);
     for(int i=0;i&lt;num;++i)
     {
           double b=0;
           for(int j=0;j&lt;num;++j)
           {
                 {
                      A.push_back(1/((double)i+(double)j+1));
                      b+=(1/((double)i+(double)j+1));
                 }
           }
           B.push_back(b);
     }
     cout&lt;&lt;"Input the delta:"&lt;&lt;endl;
     double delta;
     cin&gt;&gt;delta;
     cout&lt;&lt;"The Result is:"&lt;&lt;endl;
     Print(Jacobi(A,B,delta));
     system("PAUSE");
}</P>
发表于 2004-8-4 09:43:25 | 显示全部楼层
<>//高斯塞德尔迭代法,用法同上</P><>#include &lt;vector&gt;
#include &lt;math.h&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;</P><>using namespace std;</P><P>ofstream out("out.txt");</P><P>double operator * (vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;it1!=a.end();++it1,++it2)
            {
                   data+=((*it2)*(*it1));
            }
      }
      return data;
}</P><P>double Delta(vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;(it1!=a.end())&amp;&amp;(it2!=b.end());++it1,++it2)
            {
                  if(fabs((*it1)-(*it2))&gt;data)
                  {
                        data=fabs((*it1)-(*it2));
                  }
            }
      }
      return data;
}
                  
vector&lt;double&gt; GS(vector&lt;vector&lt;double&gt; &gt; A,vector&lt;double&gt; B,vector&lt;vector&lt;double&gt; &gt; D,vector&lt;vector&lt;double&gt; &gt; L,double delta)
{
      vector&lt;double&gt; x1(B.size(),0);
      vector&lt;double&gt; x2(B.size(),0);
      do
      {
             x1=x2;
             for(int i=0;i&lt;x2.size();++i)
             {
                    double xx=L*x2;
                    xx+=D*x1;
                    x2=(B-xx)/A;
             }
      }while(Delta(x1,x2)&gt;delta);
      return x1;
}</P><P>void Print(vector&lt;double&gt; a)
{
      vector&lt;double&gt; :: iterator it=a.begin();
      for(;it!=a.end();++it)
      {
            cout&lt;&lt;(*it)&lt;&lt;"\t";
            out&lt;&lt;(*it)&lt;&lt;"\t";
      }
      cout&lt;&lt;endl;
      out&lt;&lt;endl;
}</P><P>void Print(vector&lt;vector&lt;double&gt; &gt; A)
{
     for(int i=0;i&lt;A.size();++i)
     {
          Print(A);
     }
}
                    
int main()
{
     cout&lt;&lt;"Define the dimension of the matrix:"&lt;&lt;endl;
     int num;
     cin&gt;&gt;num;
     vector&lt;vector&lt;double&gt; &gt; A(num);
     vector&lt;double&gt; B;
     for(int i=0;i&lt;num;++i)
     {
           double bb=0;
           for(int j=0;j&lt;num;++j)
           {
                 {
                      A.push_back(1/((double)i+(double)j+1));
                      bb+=(1/((double)i+(double)j+1));
                 }
           }
           B.push_back(bb);
     }
     cout&lt;&lt;"Input the delta:"&lt;&lt;endl;
     double delta;
     cin&gt;&gt;delta;
     cout&lt;&lt;"The Result is:"&lt;&lt;endl;
     vector&lt;vector&lt;double&gt; &gt; D;
     vector&lt;vector&lt;double&gt; &gt; L;
     for(int i=0;i&lt;(int)A.size();++i)
     {
           vector&lt;double&gt; z(A.size(),0);
           vector&lt;double&gt; y(A.size(),0);
           for(int j=0;j&lt;(int)A.size();++j)
           {
                  if(j&lt;i)
                  {
                         z[j]=A[j];
                  }
                  else if(j&gt;i)
                  {
                         y[j]=A[j];
                  }
           }
           D.push_back(y);
           L.push_back(z);
     }
     Print(GS(A,B,D,L,delta));
     system("PAUSE");
}
     
     </P>
发表于 2004-8-4 09:44:10 | 显示全部楼层
<>//松弛迭代(SOR)方法</P><>#include &lt;vector&gt;
#include &lt;math.h&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;</P><>using namespace std;</P><P>ofstream out("out.txt");</P><P>double operator * (vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;it1!=a.end();++it1,++it2)
            {
                   data+=((*it2)*(*it1));
            }
      }
      return data;
}</P><P>double Delta(vector&lt;double&gt; a,vector&lt;double&gt; b)
{
      double data=0;
      if(a.size()==b.size())
      {
            vector&lt;double&gt; :: iterator it1=a.begin();
            vector&lt;double&gt; :: iterator it2=b.begin();
            for(;(it1!=a.end())&amp;&amp;(it2!=b.end());++it1,++it2)
            {
                  if(fabs((*it1)-(*it2))&gt;data)
                  {
                        data=fabs((*it1)-(*it2));
                  }
            }
      }
      return data;
}
                  
vector&lt;double&gt; GS(vector&lt;vector&lt;double&gt; &gt; A,vector&lt;double&gt; B,vector&lt;vector&lt;double&gt; &gt; D,vector&lt;vector&lt;double&gt; &gt; L,double delta,double w)
{
      vector&lt;double&gt; x1(B.size(),0);
      vector&lt;double&gt; x2(B.size(),0);
      do
      {
             x1=x2;
             for(int i=0;i&lt;(int)x2.size();++i)
             {
                    double xx=L*x2;
                    xx+=D*x1;
                    x2=(B-xx)/A;
             }
             for(int i=0;i&lt;(int)x2.size();++i)
             {
                    x2=(1-w)*x1+w*x2;
             }
      }while(Delta(x1,x2)&gt;delta);
      return x1;
}</P><P>void Print(vector&lt;double&gt; a)
{
      vector&lt;double&gt; :: iterator it=a.begin();
      for(;it!=a.end();++it)
      {
            cout&lt;&lt;(*it)&lt;&lt;"\t";
            out&lt;&lt;(*it)&lt;&lt;"\t";
      }
      cout&lt;&lt;endl;
      out&lt;&lt;endl;
}</P><P>void Print(vector&lt;vector&lt;double&gt; &gt; A)
{
     for(int i=0;i&lt;A.size();++i)
     {
          Print(A);
     }
}
                    
int main()
{
     cout&lt;&lt;"Define the dimension of the matrix:"&lt;&lt;endl;
     int num;
     cin&gt;&gt;num;
     vector&lt;vector&lt;double&gt; &gt; A(num);
     vector&lt;double&gt; B;
     for(int i=0;i&lt;num;++i)
     {
           double bb=0;
           for(int j=0;j&lt;num;++j)
           {
                 {
                      A.push_back(1/((double)i+(double)j+1));
                      bb+=(1/((double)i+(double)j+1));
                 }
           }
           B.push_back(bb);
     }
     cout&lt;&lt;"Input the delta:"&lt;&lt;endl;
     double delta;
     cin&gt;&gt;delta;
     cout&lt;&lt;"Input the SOR coefficient:"&lt;&lt;endl;
     double w;
     cin&gt;&gt;w;
     cout&lt;&lt;"The Result is:"&lt;&lt;endl;
     vector&lt;vector&lt;double&gt; &gt; D;
     vector&lt;vector&lt;double&gt; &gt; L;
     for(int i=0;i&lt;(int)A.size();++i)
     {
           vector&lt;double&gt; z(A.size(),0);
           vector&lt;double&gt; y(A.size(),0);
           for(int j=0;j&lt;(int)A.size();++j)
           {
                  if(j&lt;i)
                  {
                         z[j]=A[j];
                  }
                  else if(j&gt;i)
                  {
                         y[j]=A[j];
                  }
           }
           D.push_back(y);
           L.push_back(z);
     }
     Print(GS(A,B,D,L,delta,w));
     system("PAUSE");
}
     
     </P>
发表于 2004-8-4 09:45:05 | 显示全部楼层
以上的C++程序建议用Dev4980编译,其他的编译器本人不敢保证一定编译通过。
发表于 2004-8-4 09:51:37 | 显示全部楼层
<>不好意思,我忘了,这个程序是我很早以前做得了,大家如果想用还要修改一下,我做得程序是针对Hilbert矩阵来做得(因为当时老师要求用Hilbert矩阵来测试算法),如果要用这个程序算其他的问题请把int main()里对于矩阵A和向量B的赋值部分修改一下,用你们的A和b来对vector&lt;vector&lt;double&gt;&gt; A和vector&lt;double&gt; B赋值。</P>
发表于 2004-8-4 17:22:37 | 显示全部楼层
[em06]
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-12-1 00:46 , Processed in 0.083817 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表