主页 > 微评测 >C语言程序解线性方程组

C语言程序解线性方程组

作者: 时间:2020-07-04 914° 微评测
C语言程序解线性方程组
来你个LU分解法解方程的c程序
#include
#include
#include
#include

#define N 20
/*以下程序不选主三角分解法(Doolittle)*/
main()
{
int i,j,k,s;
float a[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2,b[N],y[N],x[N];
/*为L主对角线元素赋1*/
for(i=0;i {
L[i][i]=1;
}
/*输入矩阵a*/
for(i=0;i {
printf("请输入矩阵第%d行元素:\n",i+1);
for(j=0;jscanf("%f",&a[i][j]);
}
/*计算U第一行的元素和L第一列的元素*/
for(i=0;i {
U[0][i]=a[0][i];
L[i][0]=a[i][0]/U[0][0];
}
for(k=1;k {
/*计算矩阵U*/
for(j=k;j{
sigma1=0;
for(s=0;s<=k-1;s++)
sigma1+=L[k][s]*U[s][j];
U[k][j]=a[k][j]-sigma1;
}
/*计算矩阵L*/
for(i=k;i{
sigma2=0;
for(s=0;s<=k-1;s++)
sigma2+=L[i][s]*U[s][k];
L[i][k]=(a[i][k]-sigma2)/U[k][k];
}
}
/*输出矩阵L、U*/
printf("a矩阵为:\n");
for(i=0;i {
for(j=0;jprintf("%5.1f ",a[i][j]);
printf("\n");
}
printf("L矩阵为:\n");
for(i=0;i {
for(j=0;jprintf("%5.1f ",L[i][j]);
printf("\n");
}
printf("U矩阵为:\n");
for(i=0;i {
for(j=0;jprintf("%5.1f ",U[i][j]);
printf("\n");
}
printf("请输入b矩阵\n",i+1);
for(i=0;i scanf("%f",&b[i]);
/*回代法求解方程组Ly=b*/
for(i=0;i {
sigma1=0;
for(k=0;k<=i-1;k++)
sigma1+=L[i][k]*y[k];
y[i]=b[i]-sigma1;
}
for(i=N-1;i>=0;i--)
{
sigma2=0;
for(k=i+1;ksigma2+=U[i][k]*x[k];
x[i]=(y[i]-sigma2)/U[i][i];
}
printf("x为:\n");
for(i=0;i printf("%5.1f ",x[i]);
printf("\n");
}追问

a[i][j]中包括常数项么追答

不包括,运行之后根据提示来就行。其实可以再matlab里边直接用A矩阵的逆矩阵,左乘b矩阵,就得出结果。方法是先定义好A(10*10)矩阵,定义好b(10*1)矩阵,命令inv(A)*b得到结果随便找一本数值分析书就可以看得很详细了.强烈建议以最小二乘法求解.

#include
#include
#include
#include

#defineN20
/*以下程序为不选主元的三角分解Doolittle)*/
main()
{
inti,j,k,s;
floata[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2,b[N],y[N],x[N];
/*为L主对角线元素赋1*/
for(i=0;i {
L[i][i]=1;
}
/*输入矩阵a*/
for(i=0;i {
printf("请输入矩阵第%d行元素: ",i+1);
for(j=0;jscanf("%f",&a[i][j]);
}
/*计算U第一行的元素和L第一列的元素*/
for(i=0;i {
U[0][i]=a[0][i];
L[i][0]=a[i][0]/U[0][0];
}
for(k=1;k {
/*计算矩阵U*/
for(j=k;j{
sigma1=0;
for(s=0;s<=k-1;s++)
sigma1+=L[k][s]*U[s][j];
U[k][j]=a[k][j]-sigma1;
}
/*计算矩阵L*/
for(i=k;i{
sigma2=0;
for(s=0;s<=k-1;s++)
sigma2+=L[i][s]*U[s][k];
L[i][k]=(a[i][k]-sigma2)/U[k][k];
}
}
/*输出矩阵L、U*/
printf("a矩阵为: ");
for(i=0;i {
for(j=0;jprintf("%5.1f",a[i][j]);
printf(" ");
}
printf("L矩阵为: ");
for(i=0;i {
for(j=0;jprintf("%5.1f",L[i][j]);
printf(" ");
}
printf("U矩阵为: ");
for(i=0;i {
for(j=0;jprintf("%5.1f",U[i][j]);
printf(" ");
}
printf("请输入b矩阵 ",i+1);
for(i=0;i scanf("%f",&b[i]);
/*回代法求解方程组Ly=b*/
for(i=0;i {
sigma1=0;
for(k=0;k<=i-1;k++)
sigma1+=L[i][k]*y[k];
y[i]=b[i]-sigma1;
}
for(i=N-1;i>=0;i--)
{
sigma2=0;
for(k=i+1;ksigma2+=U[i][k]*x[k];
x[i]=(y[i]-sigma2)/U[i][i];
}
printf("x为: ");
for(i=0;i printf("%5.1f",x[i]);
printf(" ");
}我今了一个,参考一下吧:
//作品多元一次方程组的计算
//作者:与你看日出
//日期:2009年4月25日 星期六
//说明:值只能是小数(最多六位),如x=1.876546
//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小
//hang:计算中途中自己改变的未知数的个数
//JUZHEN:初始的示例矩阵
#include
#include
#define Han 200//(可自设)多元一次方程组有n行n+1列(多的一列是等号右边的值),给出行数就能确定矩阵,
#define JUZHEN {1,1,1,1,5},{1,2,-1,4,-2},{2,-3,-1,-5,-2},{3,1,2,11,0}//示例一个
main()
{
int i,j,k,m,n,t,cf,hang=4;
float temp;
float AA[Han][Han+1]={JUZHEN};//定义所要计算的数组
do//判断是否重试
{
for(i=0;i {
printf("\n");
for(j=0;j{
printf("%g\t",AA[i][j]);
}
}
printf("\n");
printf("是否自己输入?是:1;否:0");
scanf("%d",&t);
if(t==1)//判断是否自己输入数组
{

printf("输入未知数的个数");
scanf("%d",&hang);
for(i=0;i{
for(j=0;j{
printf("第%d行第%d列的数为:",i+1,j+1);
scanf("%f",&AA[i][j]);
}
}
}
for(k=0;k {

while(AA[k][k]==0)//如果第K行K列的那个数为0,则加和重组一行。
{
for(m=k+1;mfor(n=k;n{
AA[k][n]+=AA[m][n];
}
}
for(i=k;i{
temp=AA[i][k];
for(j=k;j{
AA[i][j]/=temp;
}
}
for(i=k+1;i{
for(j=0;j{
AA[i][j]-=AA[k][j];
}
}
}
for(k=hang-2;k>=0;k--)//这个大循环将数组的右上角转化为0
{
for(i=k+1;i{
AA[k][hang+1-1]-=AA[k][i]*AA[i][hang+1-1];
AA[k][i]=0;
}
}
for(i=0;i {
printf("\n");
for(j=0;j{
printf("%g\t",AA[i][j]);
}
}
printf("\n未知数的值为:\n");
for(i=0;i {
printf("x(%d)=\t%g\n",i+1,AA[i][hang+1-1]);
}
printf("\n");
printf("是否再试一次?是:1;否:0");
scanf("%d",&cf);
}
while(cf==1);//判断是否重试
}/*
Input a liner system with exactly one solution.
Work out the roots using elimination
Example Input:
2
1 1 2
1 -1 0
(x1 + x2 == 2, x1 - x2 == 0)
Output:
x1 = 1.000000
x2 = 1.000000
which are the solution
*/

#include
#include
#include

using namespace std;

const int maxn = 100;
const double eps = 1e-8;

double a[maxn][maxn],b[maxn];
int n;

void getinfo()
{
scanf("%d",&n);
for(int i=0;i {
for(int j=0;jscanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
}

void process()
{
for(int i=0;i {
int p = -1;
for(int j=i;jif(fabs(a[j][i])>eps)
p = j;
if(p==-1)
{
printf("Cannot determine the roots.\n");
return;
}
for(int j=i;jswap(b[i],b[p]);
for(int j=0;jif(j!=i && fabs(a[j][i])>eps)
{
double u = -a[j][i] / a[i][i];
for(int k=0;ka[j][k] += a[i][k] * u;
b[j] += b[i] * u;
}
}
for(int i=0;i}

int main()
{
getinfo();
process();
return 0;
}
如何用C语言解方程r^2-ar=0?


采用C语言编程解两况:
1 简单的方比如一元一次方程,或者多元一次方程,以及一元二次方程等,这类数学上有固定的解题方法的,可以在程序中输入参数,并按照数学方法,进行求解。
2 复杂的方程,比如高次方程,或者积分方程等,对于这类问题,在数学上有着自己的解法,但是移植到计算机中操作会比较繁琐,不易于编程实现。所以这类方程在计算机领域中,专门开发了更高效的算法,不适于笔算,但更符合计算机的工作方式。这时需要查找或学习对应算法并实现。
如何解多元多次方程
一元二次方程使用直接开方,公式法,配方法,分解法(直接开方因式分解法之后特殊的方程才适用,配方法与公式法适合全部一元二次方程)多元二次方程只需要在一元二次方程的基础上加上消元的思想即可,具体的消元方法可以采用代入消元法和加减消元法一元三次方程可以代入卡尔丹诺公式来解多元三次方程只需要在一元三次方程的基础上加上消元的思想即可,具体的消元方法可以采用代入消元法和加减消元法一元四次方程可以使用费拉里解法来解,也可以使用置换群解法来解,置换群解法的具体解法如下:多元四次方程只需要在一元四次方程的基础上加上消元的思想即可,具体的消元方法可以采用代入消元法和加减消元法。一般都是有公式的
怎样解多元一次方程组
可以借助excel来求解,具法如下:
方法一:矩阵解法
:对于由n个未知数,n个方程组成的多元一程组:

写成矩阵形式为Ax=b,其中A为系数n*n方阵,x为n个变量构成列向量,b为n个常数项构成列向量。当它的系数矩阵可逆,或者说对应的行列式|A|不等于0的时候,由Ax=b可得:x=b*A^(-1) ,A^(-1)为A的逆矩阵。
利用Excel提供的MDETERM、MINVERSE和MMULT等函数即可求解多元一次方程组。MDETERM函数返回一个数组的矩阵行列式的值,可用其判断矩阵是否可逆;MINVERSE函数返回矩阵的逆矩阵;MMULT函数返回两个数组的矩阵乘积。有关MMULT函数的用法可参考《用公式进行多条件求和》一文中的方法三。

方法二:用克莱姆法则
原理:参考克莱姆法则(link?url=SFQ9xiza3887GcPi1bkHiethqX40qp7tw_VvCmf3DCrSID6oTu69GIVY2Z6_0UB8hbDje-d1BNi0v67KnU27JK)。
示例及步骤:
对于上述四元一次方程组,复制P2:S5区域,将其粘贴到其他区域,如本例有4个未知数,用“选择性粘贴——粘贴链接”的方法将其粘贴到4个不同的区域。然后复制T2:T5常数项的列向量,用“选择性粘贴——粘贴链接”的方法分别将其粘贴到上述四个区域中的各列,依次得到矩阵A1、A2、A3、A4,再用MDETERM函数计算各矩阵行列式的值,分别除以系数矩阵A的行列式的值,即可得到方程组的解。
方法三:用规划求解
原理:规划求解是Excel中的一种加载项,是一种模拟分析工具,它通过调整可变单元格的值来查找满足所设定条件的最优值。本回答由推荐多元一次方程如果有m个数,m个方程式,且这m个方程式中互相没有系数相同或成比即这些方程完全不相关,则有解。
如果学习过线性代数的话,是有通解的。
如果没有学习过,即使给出通解,你也会发现要记忆这个通解式子是非常困难的。通过简单的消元、换元等方法,也是比较容易求解的。追问

请给出通解,例如x1=。。。x2=。。。可以加分追答

这里根本没法表达。。。。得要写书了。
建议去看下《线性代数》中非齐次线性方程组的内容。
如果这部分内容看不下来,就算给了通解,也解不来的。本回答被网友采纳用行列式来算

上一篇:
下一篇:

中国食品科技网|广州友邦资讯科技招聘|深圳科技资讯|网站地图