免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5645 | 回复: 11
打印 上一主题 下一主题

[算法] 求:简单迭代法的C++实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-03 09:14 |只看该作者 |倒序浏览
对数学一点不懂。谁好心,给个算法代码供参考一下

论坛徽章:
0
2 [报告]
发表于 2008-06-03 11:07 |只看该作者
google,baidu

论坛徽章:
0
3 [报告]
发表于 2008-06-03 13:56 |只看该作者
给你个例子没问题


  1. int fun ( int i )
  2. {
  3.    return i+( i?fun (i-1):i );
  4. }
  5. fun ( 10 );
复制代码

[ 本帖最后由 net_robber 于 2008-6-3 14:07 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-06-03 14:06 |只看该作者
对不起,错了
上面那个例子是递归

迭代的话,应该是


  1. int fun ( int i )
  2. {
  3.         int j=0;
  4.         while (i)
  5.         {
  6.                 j+=i--;
  7.         }
  8.         return j;
  9. }

复制代码

论坛徽章:
0
5 [报告]
发表于 2008-06-03 15:32 |只看该作者

回复 #4 net_robber 的帖子

用无回代高斯消元法,求解一次线性方程组
测试用例如下:
8a+2b+c+2.5d=1.5
a+8b-0.5c+2d=-3
1.5a+2b+8c-d=-4.5
a+0.5b+0.7c+8d=3.2

求C++程序

论坛徽章:
0
6 [报告]
发表于 2008-06-03 18:47 |只看该作者
先踩点,再下药~

论坛徽章:
0
7 [报告]
发表于 2008-06-03 19:12 |只看该作者
原帖由 pilow 于 2008-6-3 15:32 发表
用无回代高斯消元法,求解一次线性方程组
测试用例如下:
8a+2b+c+2.5d=1.5
a+8b-0.5c+2d=-3
1.5a+2b+8c-d=-4.5
a+0.5b+0.7c+8d=3.2

求C++程序



给多少钱??

论坛徽章:
0
8 [报告]
发表于 2008-06-04 08:54 |只看该作者

回复 #7 net_robber 的帖子

忽如一夜春风来,千树万树梨花开
#include <iostream>
using namespace std;

&nbsp;&nbsp;void   Gauss(double   A[],double   b[],int   n)     //高斯算法

&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int   i,j,k;   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<n;i++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=i+1;j<n;j++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[i*n+j]/=A[i*n+i];   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=i+1;k<n;k++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[k*n+j]-=A[k*n+i]*A[i*n+j];   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]/=A[i*n+i];   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=i+1;k<n;k++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[k]-=A[k*n+i]*b[i];   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//回代   

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=n-1;i>=0;i--)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=i+1;j<n;j++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]-=A[i*n+j]*b[j];   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}   
&nbsp;&nbsp;}   
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;int  main()   
&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;double   A[16]={8,2,1,2.5,1,8,-0.5,2,1.5,2,8,-1,1,0.5,0.7,8}; // 一维数组   

&nbsp;&nbsp;&nbsp;&nbsp;double   b[4]={1.5,-3,-4.5,3.2};   
&nbsp;&nbsp;&nbsp;&nbsp;int   k;   
&nbsp;&nbsp;&nbsp;&nbsp;Gauss(A,b,4);   
&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k<4;k++)   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<<"x["<<k<<"]=   "<<b[k]<<endl;   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;system("pause");  
&nbsp;}


这里用的是有回代高斯消元法,答案也是正确的,怎么修改为无回代高斯消元法
高手帮忙啊

[ 本帖最后由 pilow 于 2008-6-4 10:21 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-06-04 16:05 |只看该作者

回复 #8 pilow 的帖子

再发一个高斯消元法(选主元)的代码
#include<iostream>
#include<math.h>
using namespace std;
int GAS(float a[][4],float b[],int n,double ep)
{
&nbsp;double dmax;//用来存放列主元

&nbsp;float s,temp;//s回代时用来存s+a[j]*b[j];temp交换时用

&nbsp;int i,j,k,m;//m 为列主元所在的列

&nbsp;int IP=1;
&nbsp;for(k=0;k<n;k++)
&nbsp;{
&nbsp;&nbsp;&nbsp;dmax=fabs(a[k][k]);//找列主元

&nbsp;&nbsp;&nbsp;m=k;
&nbsp;&nbsp;&nbsp;for(i=k+1;i<n;i++)
&nbsp;&nbsp;&nbsp;if(fabs(a[i][k])>dmax)
&nbsp;&nbsp;&nbsp;{ dmax=fabs(a[i][k]);
&nbsp;&nbsp;&nbsp;&nbsp;m=i;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;if(dmax<ep)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;IP=-1;
&nbsp;&nbsp;return IP;
&nbsp;&nbsp;}
&nbsp;&nbsp;if(m!=k)
&nbsp;&nbsp;{
&nbsp;&nbsp;for(j=k;j<n;j++)//用于k列与m列的交换

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;temp=a[k][j];
&nbsp;&nbsp;&nbsp;a[k][j]=a[m][j];
&nbsp;&nbsp;&nbsp;a[m][j]=temp;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;temp=b[k];
&nbsp;&nbsp;b[k]=b[m];
&nbsp;&nbsp;b[m]=temp;
&nbsp;&nbsp;}
&nbsp;&nbsp;for(i=k+1;i<n;i++)//消元

&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;a[i][k]=a[i][k]/a[k][k];
&nbsp;&nbsp;&nbsp;for(j=k+1;j<n;j++)
&nbsp;&nbsp;&nbsp;a[i][j]=a[i][j]-a[i][k]*a[k][j];
&nbsp;&nbsp;&nbsp;b[i]=b[i]-a[i][k]*b[k];
&nbsp;&nbsp;&nbsp;}
&nbsp;}
&nbsp;
&nbsp;b[n-1]=b[n-1]/a[n-1][n-1];//回代求解

&nbsp;for(i=n-2;i>=0;i--)
&nbsp;&nbsp;{
&nbsp;&nbsp;s=0;
&nbsp;&nbsp;for(j=i+1;j<n;j++)
&nbsp;&nbsp;s=s+a[i][j]*b[j];
&nbsp;&nbsp;b[i]=(b[i]-s)/a[i][i];
&nbsp;&nbsp;}
&nbsp;return IP;
&nbsp;}
&nbsp;
int  main()
{
&nbsp;float a[4][4],b[4];
&nbsp;double ep=0.001;
&nbsp;int i,j;
&nbsp;int IP;
&nbsp;int n=4;//矩阵A为n阶的

&nbsp;cout<<"Please input a[4][4]"<<endl;
&nbsp;for(i=0;i<n;i++)
&nbsp;&nbsp;for(j=0;j<n;j++)
&nbsp;&nbsp;&nbsp;cin>>a[i][j];
&nbsp;cout<<"Please input b[4]"<<endl;
&nbsp;for(i=0;i<n;i++)
&nbsp;&nbsp;cin>>b[i];
&nbsp;IP=GAS(a,b,n,ep);
&nbsp;if(IP==-1)//判断能否用高斯列主元法

&nbsp;&nbsp;cout<<"Gauss method is failure"<<endl;
&nbsp;else
&nbsp;&nbsp;&nbsp;{//输出结果

&nbsp;&nbsp;cout<<"The solution of equation is:"<<endl;
&nbsp;&nbsp;for(i=0;i<n;i++)
&nbsp;&nbsp;&nbsp;cout<<"x["<<i+1<<"]="<<b[i]<<endl;
&nbsp;&nbsp;&nbsp;}
system("pause");
}

论坛徽章:
0
10 [报告]
发表于 2008-06-04 16:10 |只看该作者
克莱姆法则很简单,就是比对角化要慢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP