c语言解线性方程组的编程题 【做的好会多给分】

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言解线性方程组的编程题 【做的好会多给分】相关的知识,希望对你有一定的参考价值。

这么一道矩阵题,(跟在字母后面的数为下标,因为打起来费事,所以偷懒这样写了)
a11*x1+a12*x2+……+a1n*xn=b1
a21*x1+a22*x2+……+a2n*xn=b2
……………………………………
……………………………………
an1*x1+an2*x2+……+ann*xn=bn

由以上n个方程组成的方程组,要求当给a11,a12……ann赋上n*n个值,给b1--bn赋上n个值后,求出x1,x2,x3……xn。编写此程序

不管是你复制别处的程序还是你自己编写的程序,麻烦你先运行一遍,没问题了再写上来。如果做的没问题,我会加分的
匿名的那位,我运行了你的程序,好像还是有个错误。在result那行。
还有ilovelyi,我运行了你的程序,没发现错误,我还要再验证一下它的正确性以及语言的意义。如果没问题,我就把分给你了。你能把你的程序稍微做点注释吗,我好看懂一点,谢谢。看来你是高手哇 。
这题目老师说了要考虑到无解的情况,我还没研究你的程序,不知道你考虑到了吗

以下算法的适用条件:A的各阶主子式不为零
另外还可以采用
直接法:
消元法:Gauss-Jordan消元法,
分解法:Dolittle分解 (我用的是Courant分解法),追赶法,对称正定矩阵的LDL‘分解
----------
迭代法:
Jacobi迭代
Gauss-Seidel迭代
松弛迭代
-----------------
你上网可以搜索一下,或者看看数值计算方面的书

OK, 你看看这个, 另外还加了注释 :
Courant分解算法:
aX = b, 作 A=LU, L是下三角矩阵, U是上三角矩阵
即L =
| L11
| L21 L22
| L31 L32 L33
| ..............
| Ln1 Ln2 ........Lnn

U =
| 1 U12 ..... U1n
| 空格 1 ..... U2n
| 空格 空格 ........
| 空格 空格 空格 空格 空格1
---------------------------------------------------
aX = b -----> LUX = b
记 UX = y,
由Ly = b得到
因为无法输出数学符号,以下采用[i, j]Ai 表示对Ai从i到j求和
yi = (bi - [j=1, i-1]Lij yj) / Lii i = 1, 2, ..., n
由UX = y得到
xi = yi - [j=i+1, n]uij xj j = n, n-1, ..., 2, 1
你在纸上验证一下就明白了
--------------------------------------------------------------

以下采用Courant分解 解 aX = b, 经检查,程序运行正确
这是运行结果:
--------------------------------------------------------------
Input n value(dim of Ax=b): 3
Now input the matrix a(i, j), i, j = 0, ..., 2:
1 2 1 -2 -1 -5 0 -1 6
Now input the matrix b(i), i = 0, ..., 2:
24 -63 50
Solve...x_i =
7.000000
4.000000
9.000000
--------------------------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#define MAX_N 20
int main(int argc, char* argv[])

int n; // 未知数个数
int i, j, k;
static double a[MAX_N][MAX_N], b[MAX_N], x[MAX_N], y[MAX_N];
static double l[MAX_N][MAX_N], u[MAX_N][MAX_N];
printf("\nInput n value(dim of Ax=b): ");
scanf("%d", &n);
if(n >MAX_N)

printf("The input n is larger than MAX_N, please redefine the MAX_N.\n");
return 1;

if(n <= 0)

printf("Please input a number between 1 and %d.\n", MAX_N);
return 1;

// 程序输入
printf("Now input the matrix a(i, j), i, j = 0, ..., %d:\n", n-1);
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%lf", &a[i][j]);
printf("Now input the matrix b(i), i = 0, ..., %d:\n", n-1);
for(i=0; i<n; i++)
scanf("%lf", &b[i]);
// 程序输入
for(i=0; i<n; i++)
u[i][i] = 1; //
for(k=0; k<n; k++)

for(i=k; i<n; i++) // 计算L的第k列元素

l[i][k] = a[i][k];
for(j=0; j<=k-1; j++)
l[i][k] -= (l[i][j]*u[j][k]);

for(j=k+1; j<n; j++) //计算U的第k行元素

u[k][j] = a[k][j];
for(i=0; i<=k-1; i++)
u[k][j] -= (l[k][i]*u[i][j]);
u[k][j] /= l[k][k];


for(i=0; i<n; i++) // 解Ly = b

y[i] = b[i];
for(j=0; j<=i-1; j++)
y[i] -= (l[i][j]*y[j]);
y[i] /= l[i][i];

for(i=n-1; i>=0; i--) // 解UX = Y

x[i]=y[i];
for(j=i+1; j<n; j++)
x[i] -= (u[i][j]*x[j]);

printf("Solve...x_i = \n"); // 输出结果
for(i=0; i<n; i++)
printf("%f\n", x[i]);
return 0;
参考技术A 1个二维数组+1个1维数组 参考技术B 我的运行过了,没有问题:
#include <stdio.h>
#include <stdlib.h>

#define N 10 //矩阵大小范围

/*
* 使用已经求出的x,向前计算x(供getx()调用)
* float a[][] 矩阵U
* float x[] 方程组解
* int i 解的序号(数组X元素序号)
* int n 矩阵大小
* return 公式中需要的和
*/
float getmx(float a[N][N], float x[N], int i, int n)

float mx = 0;
int r;
for(r=i+1; r<n; r++)

mx += a[i][r] * x[r];

return mx;


/*
* 使用已经求出的y,向前计算y(供gety()调用)
* float a[][] 矩阵L
* float y[] 数组Y
* int i 数组Y元素序号
* int n 矩阵大小
* return 公式中需要的和
*/
float getmy(float a[N][N], float y[N], int i, int n)

float my = 0;
int r;
for(r=0; r<n; r++)

if(i != r) my += a[i][r] * y[r];

return my;


/*
* 解方程组,计算某x
* float a[][] 矩阵U
* float x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 方程组的第i个解(数组X的第i个元素值)
*/
float getx(float a[N][N], float b[N], float x[N], int i, int n)

float result;

if(i==n-1) //计算最后一个x的值
result = (float)(b[i]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getmx()函数)
result = (float)((b[i]-getmx(a,x,i,n))/a[i][i]);

return result;


/*
* 解数组Y,计算其中一元素值
* float a[][] 矩阵L
* float y[] 数组Y
* int i 数组Y元素序号
* int n 矩阵大小
* return 数组Y的第i个元素值
*/
float gety(float a[N][N], float b[N], float y[N], int i, int n)

float result;

if(i==0) //计算第一个y的值
result = float(b[i]/a[i][i]);
else //计算其他y值(对于公式中的求和部分,需要调用getmy()函数)
result = float((b[i]-getmy(a,y,i,n))/a[i][i]);

return result;


void main()

float l[N][N]=0; //定义L矩阵
float u[N][N]=0; //定义U矩阵
float y[N]=0; //定义数组Y
float x[N]=0; //定义数组X
float a[N][N]=0; //定义系数矩阵
float b[N]=0; //定义右端项
float sum=0;
int i,j,k;
int n=3;
int flag=1;

//输入矩阵
while(flag)

printf("请输入系数矩阵的大小:");
scanf("%d", &n);
if(n>N)
printf("矩阵过大!\n");
continue;

flag=0;

printf("请输入系数矩阵值:\n");
for(i=0; i<n; i++)

for(j=0; j<n; j++)

printf("a[%d][%d]: ", i, j);
scanf("%f", &a[i][j]);


printf("请输入右端项数组:\n");
for(i=0; i<n; i++)

printf("b[%d]: ", i);
scanf("%f", &b[i]);


/*显示原始矩阵*/
printf("\n原始矩阵:\n");
for(i=0; i<n; i++)

for(j=0; j<n; j++)
printf("%0.3f ",a[i][j]);
printf("\n");

printf("\n\n");

/*初始化矩阵l*/
for(i=0; i<n; i++)

for(j=0; j<n; j++)

if(i==j) l[i][j] = 1;



/*开始LU分解*/
/*第一步:对矩阵U的首行进行计算*/
for(i=0; i<n; i++)

u[0][i] = (float)(a[0][i]/l[0][0]);

/*第二步:逐步进行LU分解*/
for(i=0; i<n-1; i++)

/*对“L列”进行计算*/
for(j=i+1; j<n; j++)

for(k=0,sum=0; k<n; k++)

if(k != i) sum += l[j][k]*u[k][i];

l[j][i] = (float)((a[j][i]-sum)/u[i][i]);

/*对“U行”进行计算*/
for(j=i+1; j<n; j++)

for(k=0,sum=0; k<n; k++)

if(k != i+1) sum += l[i+1][k]*u[k][j];

u[i+1][j] = (float)((a[i+1][j]-sum));



/*输出矩阵l*/
printf("矩阵L:\n");
for(i=0; i<n; i++)

for(j=0; j<n; j++)

printf("%0.3f ", l[i][j]);

printf("\n");


/*输出矩阵u*/
printf("\n矩阵U:\n");
for(i=0; i<n; i++)

for(j=0; j<n; j++)

printf("%0.3f ", u[i][j]);

printf("\n");


/*回代方式计算数组Y*/
for(i=0; i<n; i++)

y[i] = gety(l,b,y,i,n);


/*显示数组Y*/
printf("\n\n数组Y:\n");
for(i=0; i<n; i++)

printf("y%d = %0.3f\n", i+1,y[i]);


/*回代方式计算数组X*/
for(i=n-1; i>=0; i--)

x[i] = getx(u,y,x,i,n);


/*显示数组X*/
printf("\n\n数组X:\n");
for(i=0; i<n; i++)

printf("x%d = %0.3f\n", i+1,x[i]);

C语言 用牛顿迭代法解方程

点击上方“蓝字”关注我们
C语言 用牛顿迭代法解方程




愉快的一天,不得不做的三件事:

        种田,锄地,整代码!!!







【题目】


用牛顿迭代法求解任意的三次方程:

ax^3+bx^2+cx+d=0

要求a、b、c、d从键盘输入,使用循环方法编程。





【设计思路】


f(x)= ax3+bx2+cx+d=((a*x+b)*x+c)*x+d.求出方程的表达式f(x)的导数f1(x)=(3*a*x+2*b)*x+c.计算曲线上的点(x0,f(x0))的切线与x轴的交点x

x=x0-f(x0)/f1(x0)


任取初始点x,在循环中进行迭代:

x0=x

x=x0-f(x0)/f1(x0)


依次继续,直至xx0的差满足指定精度的要求为止.





【代码分析】


float a,b,c,d;  //定义三次方程的系数

float x,x0;                      

float f,f1;  //定义三次方程表达式和和其一阶导数表达式



printf("请依次输入三次方程的四个系数 a,b,c,d:\n");

scanf("%f%f%f%f",&a,&b,&c,&d);

printf("请输入x0的值:");

scanf("%f",&x0); 


//输入系数和初始点



x=x0;

do

{

    f=((a*x+b)*x+c)*x+d; 

    f1=(3*a*x+2*b)*x+c;

    x=x-f/f1;

}

while(fabs(f/f1)>1e-7);

printf("方程在x0=%f附近的根是:x= %f",x0,x);


//进行循环迭代,直至f/f1满足指定精度





【代码展示】


C语言   用牛顿迭代法解方程

#include<stdio.h>

#include<math.h>


void equation()

{

float a,b,c,d;

float x,x0;

float f,f1;

printf("-------欢迎进入<用牛顿迭代法解方程>操作界面-------\n\n");

printf("请依次输入三次方程的四个系数 a,b,c,d:\n");

scanf("%f%f%f%f",&a,&b,&c,&d);

printf("请输入x0的值:");

scanf("%f",&x0); 


printf("\n"); 

x=x0;

do

{

f=((a*x+b)*x+c)*x+d; 

f1=(3*a*x+2*b)*x+c;

x=x-f/f1;

}

while(fabs(f/f1)>1e-7);

printf("方程在x0=%f附近的根是:x= %f",x0,x);

}


int main()

{

equation();

return 0;

}






【运行结果展示】


C语言 用牛顿迭代法解方程






C语言 用牛顿迭代法解方程


牛顿迭代法


牛顿迭代法又称为牛顿-拉夫逊方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,利用迭代算法解决问题,需要做好以下三个方面的工作:


一、确定迭代变量,在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

C语言 用牛顿迭代法解方程


二,建立迭代关系式,所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式或关系。迭代关系式的建立,是解决迭代问题的关键,通常可以使用递推或倒退的方式来完成。

C语言 用牛顿迭代法解方程


三、对迭代过程进行控制。


(文字、图片来源于秒懂百科)


IT 农工要回家休息了,我们下期再见吧

记得点击“在看”进行收藏哦




往期精彩





以上是关于c语言解线性方程组的编程题 【做的好会多给分】的主要内容,如果未能解决你的问题,请参考以下文章

学C++语言应该注意啥

C语言求一元二次方程解的函数问题 新手题

C语言编程 解一元二次方程

C语言 用牛顿迭代法解方程

怎么用C语言解多元一次方程?需要得到最合适的解。

c语言解一元二次方程