高斯约旦消元法
用来求解n元一次线性方程组
核心思想:
把方程组塞到一个矩阵里得到一个的矩阵,第行表示第个方程,表示第个方程中的系数 为一个常数,即等号右面的常数
把的系数都集中于第行(对角线上),为当前选择的主元,然后用方程把其他方程中的都消掉,可得到每行都是的矩阵,显然
void work(){
n=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=n+1;++j){
Mat[i][j]=read();
}
}
for(int i=1;i<=n;++i){//枚举项xi
double maxx=Mat[i][i];
int tmp=i;
//x1--xi-1 的系数都在方程i上,其他方程该项系数为0,如果用方程1--i-1来消元会引入x1--xi-1,所以从i开始找
for(int j=i+1;j<=n;++j){//选出该列最大系数可以保证误差最小
if(fabs(Mat[j][i])>fabs(maxx)){
maxx=Mat[j][i];tmp=j;
}
}
for(int j=1;j<=n+1;++j){
swap(Mat[i][j],Mat[tmp][j]);//把方程i和方程tmp整个交换,使得系数集中在对角线上
}
if(Mat[i][i]==0){//多解
puts("No Solution");return;
}
//把除了Mat[i][i] 其他方程xi的系数都消掉
for(int j=1;j<=n;++j){
if(j==i)continue;
double x=Mat[j][i]/Mat[i][i];
for(int k=i+1;k<=n+1;++k){
Mat[j][k]-=Mat[i][k]*x;
}
}
}
for(int i=1;i<=n;++i){
double ans=Mat[i][n+1]/Mat[i][i];
printf("%.2lf\n",ans);
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库