当前位置:首页 » 编程语言 » 线性四元一次方程组的c语言代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

线性四元一次方程组的c语言代码

发布时间: 2022-10-09 06:11:21

A. 请帮助用c语言求解两个4X4的方程组(迭代法还是直接法):谢谢咯

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

//本次设定精度要求为.00001。使用迭代法。

floatsum1(floata[4],floatb[4])//定义函数sum1,实现两个数组对应位置相乘再求和。

{

floatc=0;

inti;

for(i=0;i<4;i++)

c=c+a[i]*b[i];

return(c);

}

voidmain()

{

floata[4]={1.00,0.63,-0.83,0.87};

floatb[4]={-0.07,0.78,0.56,-0.50};

floatc[4]={0.14,-0.26,0.38,-0.354};

floatd[4]={-0.20,-0.76,-0.35,-0.36};

floatm[4]={-1,-0.07,0.14,0.2};//要用算法判别出来的期望结果。

floatw[4]={1,1,1,1};//随便选的初始解,一会用迭代法就不断修改这个数值了。

floatp=0.1,e,E=10;//p为w的调整系数,e用来求总误差,p任意定义的。

floatk[4];//用以存放迭代出的结果,可以轻松的和期望结果进行比较。

inti,l,count=0;//其中count是用来存放整体循环判断的次数。

while(E>0.00001)

{

E=0;

for(i=0;i<4;i++)

{

k[0]=sum1(a,w);

k[1]=sum1(b,w);

k[2]=sum1(c,w);

k[3]=sum1(d,w);

e=m[i]-k[i];

for(l=0;l<4;l++)

{

if(i==0){w[l]=w[l]+p*e*a[l];}

if(i==1){w[l]=w[l]+p*e*b[l];}

if(i==2){w[l]=w[l]+p*e*c[l];}

if(i==3){w[l]=w[l]+p*e*d[l];}

}

E=E+0.5*e*e;

}

count++;

}

for(i=0;i<4;i++)

{

printf("k[%d]=%f",i,k[i]);

}

printf("方程组满足条件的最终的迭代解为:[");

for(i=0;i<4;i++)

{

printf("%f",w[i]);

}

printf("]");

printf(" 最终循环迭代判断的次数是:%d",count);

}

/*你的电脑上的C要是不支持中文的话,你把中文全部该成英文就好。至于第二个方程组,你按照上面的把数组的值改下就出结果了,很简单,程序我已经测试过了完全可以执行,*/

B. 用无回代的高斯消元法和简单迭代法 解四元一次方程组

N元通用程序,用四元调用.四元方程组:
a[4][5]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0};

高斯消元法(通用程序):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float *ColPivot(float *c,int n);

void main()
{
int i,j;
float *x;
int n=4;
float a[4][5]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0};

x=ColPivot(a[0],n);
for (i=0;i<n;i++) printf("x[%d]=%f\n",i,x[i]);
getch();
}

float *ColPivot(float *c,int n)
{
int i,j,t,k;
float *x,p;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
}
return x;
}
-------------------------------------------
高斯赛德尔迭代法(通用程序):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
float *GauseSeidel(float *a,int n)
{
int i,j,nu=0;
float *x,dx;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
x[i]=0.0;
do {
for(i=0;i<=n-1;i++) {
float d=0.0;
for(j=0;j<=n-1;j++)
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu>=N)
{
printf("iter divergence\n");
exit(1);
}
nu++;
}
while(fabs(dx)>1e-6);
return x;
}
void main()
{
int i;
float *x;

float c[20]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0};
float *GauseSeidel(float *,int);
x=GauseSeidel(c,4);
for(i=0;i<=3;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}

C. 如何用C语言解四元一次方程组

首先要找到二元一次方程组的通解,例如:
ax+by=m
cx+dy=n
不难算出
x=(md-bn)/(ad-bc)
y=(mc-an)/(bc-ad)
这相当于知道了算法,接下来就可以编程序了:
int main(){
int a,b,c,d,m,n;
double x=0,y=0;
scanf("%d,%d,%d,%d,%d,%d",&a,&b,&c,&d,&m,&n);
if(a*d==b*c||b*c==a*d)puts("无解");
else{
x=(m*d-b*n)/(a*d-b*c);
y=(m*c-a*n)/(b*c-a*d);
printf("x=%f,y=%f",x,y);
}
return 0;
} 输入系数,就可以计算了

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

以下算法的适用条件: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;
}

E. 用MATLAB解四元一次方程,急!急!急!谢谢了!!!

你说的那个可不是
四元一次方程组
哦,这个非线性方程组,一般只能用数值解法,solve函数就不行了。
用fsolve取适当的初值是可以解出的

F. 线性方程组求解——C语言程序设计代码,高手们,拜托啦!急急急啊!!!

这是矩阵运算的两个文件,调用相应的函数即可:

// Matrix.h: interface for matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)
#define AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n);

////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n);

////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n);

////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k);

////matrixATA=(matrixA)T*matrixA,m,n分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n);

////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m);

///*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n);

////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n);
void MatInversion(float *a,int n);

////解矩阵方程matrixA*matrixX=matrixL,m,n分别为matrixA矩阵的行,列数
void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n);

#endif // !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)

// Matrix.cpp: implementation of the matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Matrix.h"
#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n)
{
float liner=0;
int i=0,j=0,k=0;
int p=0,q=0;

if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
for(k=0;k<n;k++)
{
p=0;
for(i=0;i<n;i++)
{
if(i!=0)
{
q=0;
for(j=0;j<n;j++)
{
if(j!=k)
{
tr[p*(n-1)+q]=matrix[i*n+j];
q++;
}
}
p++;
}
}
liner+=matrix[k]*pow(-1,k)*CalculateLiner(tr,n-1);
}
free(tr);
return liner;
}
}

////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n)
{
int x=0,y=0;
int p=0,q=0;

if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
p=0;
for(x=0;x<n;x++)
{
if(x!=i)
{
q=0;
for(y=0;y<n;y++)
{
if(y!=j)
{
tr[p*(n-1)+q]=matrix[x*n+y];
q++;
}
}
p++;
}
}
float cc=pow(-1,i+j)*CalculateLiner(tr,n-1);
free(tr);
return cc;
}

}

////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n)
{
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
matrixAT[j*m+i]=matrixA[i*n+j];
}
}
}

////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k)
{
for (int m=0;m<i;m++)
{
for (int n=0;n<k;n++)
{
matrixAB[m*k+n]=0;
for (int s=0;s<j;s++)
{
matrixAB[m*k+n]+=matrixA[m*j+s]*matrixB[s*k+n];
}
}
}
}

////matrixATA=(matrixA)T*matrixA,m,n为分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n)
{
float *at=(float *)calloc((m)*(n),sizeof(float));
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixA,matrixATA,n,m,n);
free(at);
}

////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m)
{
float liner=CalculateLiner(matrixA,m);

for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
matrixA_[j*m+i]=CalculateCofacter(matrixA,i,j,m)/liner;
}
}
////////////////////////////////////////////////////////////////////
////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n)
{
int i, j, k, m;
float w, g, *b;

b = new float [n];

for(k = 0; k <= n - 1; k++)
{
w = a[0];

w=a[0]+1.0e-15;
/*
if(fabs(w)+1.0 == 1.0)
{
delete b;
printf("fail\n");
return(-2);
}
*/
m = n - k - 1;

for(i = 1; i <= n - 1; i++)
{
g = a[i * n];
b[i] = g / w;

if(i <= m)
b[i] = -b[i];

for(j = 1; j <= i; j++)
a[(i - 1) * n + j - 1] = a[i * n + j] + g * b[j];
}
a[n * n - 1] = 1.0 / w;

for(i = 1; i <= n - 1; i++)
a[(n - 1) * n + i - 1] = b[i];
}

for(i = 0; i <= n - 2; i++)
for(j = i + 1; j <= n - 1; j++)
a[i * n + j] = a[j * n + i];
delete b;
return(2);
}

////求正定矩阵a的逆矩,n为阶数
void MatInversion(float *a,int n)
{
int i,j,k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
if(i!=k) *(a+i*n+k) = -*(a+i*n+k)/(*(a+k*n+k));
}
*(a+k*n+k)=1/(*(a+k*n+k));
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k) *(a+i*n+j) += *(a+k*n+j)* *(a+i*n+k);
}
}
}
for(j=0;j<n;j++)
{
if(j!=k) *(a+k*n+j)*=*(a+k*n+k);
}
}
}

/*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n)
{
int *is,*js;
int i,j,k,l,u,v;
float temp,max_v;
is=(int *)malloc(n*sizeof(int));
js=(int *)malloc(n*sizeof(int));
if(is==NULL||js==NULL)
{
printf("out of memory!\n");
return(0);
}
for(k=0;k<n;k++)
{
max_v=0.0;
for(i=k;i<n;i++)
{
for(j=k;j<n;j++)
{
temp=fabs(m1[i*n+j]);
if(temp>max_v)
{
max_v=temp; is[k]=i; js[k]=j;
}
}
}
if(max_v==0.0)
{
free(is); free(js);
printf("invers is not availble!\n");
return(0);
}
if(is[k]!=k)
{
for(j=0;j<n;j++)
{
u=k*n+j; v=is[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+js[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
l=k*n+k;
m1[l]=1.0/m1[l];
for(j=0;j<n;j++)
{
if(j!=k)
{
u=k*n+j;
m1[u]*=m1[l];
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k)
{
u=i*n+j;
m1[u]-=m1[i*n+k]*m1[k*n+j];
}
}
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
u=i*n+k;
m1[u]*=-m1[l];
}
}
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
u=k*n+j; v=js[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+is[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
free(is); free(js);
return(1);
}

void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n)
{
if (m<n) return;
float *at=(float *)malloc((m)*(n)*sizeof(float));
float *ata=(float *)malloc((n)*(n)*sizeof(float));
float *atl=(float *)malloc((n)*sizeof(float));

CalculateATA(matrixA,ata,m,n);
MatrixInversion(ata,n);
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixL,atl,n,m,1);
CalculateAB(ata,atl,matrixX,n,n,1);

free(at);
free(ata);
free(atl);
}

G. 四元一次方程!! c语言!!

#include <iostream>
using namespace std;

int main()
{
int i,j,m,n;
int num = 0;
int s;
cin >>s;

for(i=0; i<= s/4;i++)
for (j= 0; j<=s/3; j++)
{
if (4*i+3*j > s)
break;
for(m=0; m<=s/2;m++)
{

if (4*i+3*j+2*m > s)
break;
for(n=0; n <= s; n++)
{
if(4*i+3*j+2*m+n == s)
num++;
}
}
}
cout <<num<<endl;
return 0;
}
这是最简单的方法,但是时间复杂度很高,你看看能不能改进算法!

H. 求一个用消元法解四元一次方程组的C语言代码

这是我很久前写的程序。
程序例子是 4*5 增广矩阵。
你可以改变 阶数 int n=4; n 的值,可以另写 方程系数 输出语句。直接调用
float *ColPivot(float *c,int n); 就得到解。
/* ==========================================
* GaoSi_XiaoQu.c
* ==========================================*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float *ColPivot(float *c,int n);

void main()
{
int i,j;
float *x;
int n=4;
float a[4][5]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0};
x=ColPivot(a[0],n);
for (i=0;i<n;i++) printf("x[%d]=%f\n",i,x[i]);
getch();
}
float *ColPivot(float *c,int n)
{
int i,j,t,k;
float *x,p;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
}
return x;
}