- #include "math.h"
- #include "iostream"
- #include <stdio.h>
- #include <cstdlib>
- using namespace std;
- int main()
- {
- int m,n,i,j,k=0,num;
- cout<<"Please inter A's order"<<endl;
- cin>>m;
- double a[m+1]={0};
- cout<<"Please inter A by order from low to high"<<endl;
- for(i=0;i<m+1;i++)
- cin>>a[i];
- cout<<"Please inter B's order"<<endl;
- cin>>n;
- double b[n+1]={0};
- cout<<"Please inter B by order from low to high"<<endl;
- for(i=0;i<n+1;i++)
- cin>>b[i];
- num=m+n;
- double t[num]={0};
- cout<<"Please inter T by order from low to high"<<endl;
- for(i=0;i<num;i++)
- cin>>t[i];
- cout<<"the result is:"<<endl;
- double c[num][num]={0},d[num]={0},e[num][2*num]={0};
- double h[n], g[m];
- double xishu=1.0;
- for(i=0;i<num;i++)
- for(j=0;j<num;j++)
- {
- c[i][j]=0;
- }
- //构造转换矩阵的前n列
- for(i=0;i<m+1;i++)
- for(j=0;j<m+1;j++)
- {
- if((i+j)<num&&i<num)
- c[i+j][i]=a[j];
- }
- //构造转换矩阵的后m列
- for(i=0;i<n;i++)
- for(j=0;j<n+1;j++)
- {
- if((i+j)<num&&(n+i)<num)
- c[i+j][n+i]=b[j];
- }
- for(i=0;i<num;i++) //增广矩阵赋值,前半部分
- {
- for(j=0;j<num;j++)
- {
- e[i][j] =c[i][j];
- }
- }
- for(i=0;i<num;i++) //增广矩阵赋值,后半部分
- {
- for(j=num;j<2*num;j++)
- e[i][j] = 0;//先将后半部分全部赋值为0
- e[i][i+num] = 1;//再将其对角线部分赋值为1
- }
- //接下来进行初等行变换
- for(i=0;i<num;i++)
- {
- if(e[i][i] == 0)//如果前半部分的对角线上的元素为0,此时进行行变换
- {
- if(i == num-1)//如果是最后一行,那么说明该矩阵不可逆
- {
- cout<<"bu ke ni !"<<endl;
- return false;
- }
- //对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换
- for(j=i;j<num;j++)
- {
- if(e[j][i] != 0)
- {
- k = j;//记住该行的行号
- break;//退出循环
- }
- }
- //接下来对第i行和第k行进行交换
- for(int l=0;l<2*num;l++)
- {
- double temp=e[k][l];
- e[k][l] = e[i][l];
- e[i][l] = temp;
- }
- }
- //初等变换
- for(j=0;j<num;j++)//对其他行的所有列进行计算
- {
- if(j != i)//本行不参与计算
- {
- if(e[j][i] != 0)//只有当其不为零时进行计算,否则不计算
- {
- xishu = e[j][i]/e[i][i];
- for(k=i;k<2*num;k++)//对后面的所有列进行计算
- {
- e[j][k] -= xishu*e[i][k];
- }
- }
- }
- }
- //将本行所有列都除以对角线上的值,将前半部分化成单位矩阵
- xishu = e[i][i];
- for(j=i;j<2*num;j++)
- if(xishu != 0) e[i][j] /= xishu;
- }
- //求解
- for(i=0;i<num;i++)
- {
- for(j=num;j<2*num;j++)
- {
- d[i]+=e[i][j]*t[j-num];
- }
- }
- //输出h[n]
- cout<<"h["<<n<<"]=[ ";
- for(i=0;i<n;i++)
- {
- h[i]=d[i];
- cout<<h[i]<<" ";
- }
- cout<<"]"<<endl;
- //输出g[m]
- cout<<"g["<<m<<"]=[ ";
- for(j=n;j<num;j++)
- {
- g[j-n]=d[j];
- cout<<g[j-n]<<" ";
- }
- cout<<"]"<<endl;
- return 0 ;
- }
- //该片段来自于http://www.codesnippet.cn/detail/2705201512678.html
来源: http://www.codesnippet.cn/detail/2705201512678.html