當前位置:首頁 » 編程語言 » c語言解線性方程

c語言解線性方程

發布時間: 2022-02-17 09:39:03

c語言程序解線性方程組

給,下面的代碼已經編譯運行確認,肯定好用了,試試吧:)

#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d

float A[NUMBER][NUMBER+1] ,ark;
int flag,n;

void exchange(int r,int k);
float max(int k);
void message();

int main()
{
float x[NUMBER]; /*此數組用於存放方程解*/
int k,i,j;
char celect;

system("cls");

printf("\n用Gauss列主元消元法解線性方程組");
printf("\n1.解方程組請按Enter.");
printf("\n2.退出程式請按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n 輸入方程組的維數:n=");
scanf("%d",&n);
printf("\n現在輸入系數矩陣A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n請輸入a%d1--a%d%d系數和向量b%d: \n",i,i,n,i);
/*實現將每一行中的系數和向量一次性輸入,數之間用空格格開,輸完後回車確定*/

for(j=1;j<=n+1;j++) /*將剛才輸入的數存入數組*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判斷方程是否為線性方程,即是否合法*/
{
printf("\n此方程組不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf("\nx%d=%f",i,x[i]);
}
message();

getch();
return 1;
}

void exchange(int r,int k) /*交換行的矩函數*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}

float max(int k) /*比校系數大小的函數*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}

void message() /*實現菜單選擇的函數*/
{
printf("\n 繼續運算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n不合法的輸入!");message();}
}
}

Ⅱ 用C語言編寫線性方程組數值解法程序

題目就不懂……高斯消元倒是簡單

Ⅲ 模擬退火演算法解一般線性方程的C語言程序

好奇怪的問題,解一般線性方程用模擬退火演算法做??!!是規劃問題還是什麼?解一般線性方程應該看線性代數的,用模擬退火演算法干什麼。雖然我做過模擬退火演算法的C語言實現

Ⅳ 用C語言求解N階線性矩陣方程Ax=b的簡單解法

基礎解系的求法

(1)對A作行初等變換,化為最簡階梯形
(2)寫出原方程組的同解方程組
(3)取定自由未知量,得基礎解系
a.每個非零行中第一個非零系數所代表的變數是主元,共R(A)個,剩餘的變數就是自由變數,共n-R(A)個;
b.在最簡階梯形矩陣中找出秩為R(A)的行列式,那麼其他各列的變數就是自由變數
3.其次線性方程組的解的判定
(1)AX=0隻有零解:R(A)=n
(2)AX=0有無窮多個非零解:R(A)=r<n
A的列向量線性相關
特別的:n階矩陣AX=0有無窮多個非零解,|A|=0
注意:若AB=0,則B的每一列都是AX=0的解
當B≠0時,意味著AX=0有非零解,進而R(B)≤n-R(A),R(A)+R(B)≤n

Ⅳ C語言程序設計:線性方程組求解

程序能成功運行,用的高斯消元法
不過沒有給出菜單
輸入提示信息比較清楚
某次的結果如下:
你要解幾元線性方程組:
2
請輸入第1行相應的系數:
a[0][0]: 2
a[0][1]: -1
請輸入第1行相應的常數:
b[0]: 3
請輸入第2行相應的系數:
a[1][0]: 1
a[1][1]: 1
請輸入第2行相應的常數:
b[1]: 9
方程組:
2.000000X1 - X2= 3.000000
X1 + X2= 9.000000
該方程組的解為:
x1 = 4.00
x2 = 5.00
Press any key to continue

程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

int GS(int,double**,double *,double);
double **TwoArrayAlloc(int,int);
void TwoArrayFree(double **);

void main()
{
int i,j,n;
double ep,**a,*b;
ep = 1e-4;
printf("你要解幾元線性方程組:\n");
scanf("%d",&n);
a = TwoArrayAlloc(n,n);
b = (double *)calloc(n,sizeof(double));
if(b == NULL)
{
printf("內存分配失敗\n");
exit(1);
}

for(i=0;i<n;i++)
{
printf("請輸入第%d行相應的系數:\n",i+1);
for(j=0;j<n;j++)
{
printf("a[%d][%d]: ",i,j);
scanf("%lf",a[i]+j);
fflush(stdin);
}
printf("請輸入第%d行相應的常數:\n",i+1);
printf("b[%d]: ",i);
scanf("%lf",b+i);
fflush(stdin);
}
printf("方程組:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>0)
{
if(j>0)printf(" + ");
if(a[i][j]!=1)
printf("%lfX%d",a[i][j],j+1);
else
printf("X%d",j+1);

}
if(a[i][j]<0)
{
if(j>0)printf(" - ");
if(a[i][j]!=-1)
printf("%lfX%d",fabs(a[i][j]),j+1);
else
printf("X%d",j+1);
}

}
printf("= %lf\n",b[i]);
}

if(!GS(n,a,b,ep))
{
printf("不可以用高斯消去法求解\n");
exit(0);
}
printf("該方程組的解為:\n");
for(i=0;i<n;i++)
printf("x%d = %.2f\n",i+1,b[i]);
TwoArrayFree(a);
free(b);
}

int GS(int n,double **a,double *b,double ep)
{
int i,j,k,l;
double t;
for(k=1;k<=n;k++)
{
for(l=k;l<=n;l++)
if(fabs(a[l-1][k-1])>ep)
break;
else if(l==n)
return(0);
if(l!=k)
{
for(j=k;j<=n;j++)
{
t = a[k-1][j-1];
a[k-1][j-1]=a[l-1][j-1];
a[l-1][j-1]=t;
}
t=b[k-1];
b[k-1]=b[l-1];
b[l-1]=t;
}
t=1/a[k-1][k-1];
for(j=k+1;j<=n;j++)
a[k-1][j-1]=t*a[k-1][j-1];
b[k-1]*=t;
for(i=k+1;i<=n;i++)
{
for(j=k+1;j<=n;j++)
a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1];
b[i-1]-=a[i-1][k-1]*b[k-1];
}
}
for(i=n-1;i>=1;i--)
for(j=i+1;j<=n;j++)
b[i-1]-=a[i-1][j-1]*b[j-1];
return(1);
}

double **TwoArrayAlloc(int r,int c)
{
double *x,**y;
int n;
x=(double *)calloc(r*c,sizeof(double));
y=(double **)calloc(r,sizeof(double*));
if(!x||!y)
{
printf("內存分配失敗\n");
exit(1);
}
for(n=0;n<=r-1;++n)
y[n]=&x[c*n];
return (y);
}

void TwoArrayFree(double **x)
{
free(x[0]);
free(x);
}

Ⅵ C語言 解線性方程

我有列主元消的;
#include<stdio.h>
#include<math.h>
void main()
{
float a[4][4]={{1.003,0.333,1.504,-0.333},{-2.011,1.455,0.506,2.956},{4.329,-1.952,0.006,2.087},{5.113,-4.004,3.332,-1.112}};
float b[4]={3.005,5.407,0.136,3.772};
float c,d;
int i,j,k,s,p,l;
for(j=0;j<4;j++ )
{
for(i=j;i<4;i++)
{
k=i;
for(s=i+1;s<4;s++)
{
if(fabs(a[s][j])>fabs(a[k][j]))
k=s;
}
for(p=0;p<4;p++)
{
c=a[i][p];
a[i][p]=a[k][p];
a[k][p]=c;
}
c=b[i];
b[i]=b[k];
b[k]=c;
}
}

for(s=0;s<4;s++)
{
for(p=0;p<4;p++)
printf("%f ",a[s][p]);
printf("%f\n",b[s]);
}
for(j=0;j<4;j++)
{
for(l=j+1;l<4;l++)
{
d=a[l][j]/a[j][j];
b[l]= b[l]-b[j]*d;
for(p=j;p<4;p++)
a[l][p]=a[l][p]-d*a[j][p];
}
}
printf("\n");
for(s=0;s<4;s++)
{
for(p=0;p<4;p++)
{
printf("%f ",a[s][p]);}
printf("%f\n",b[s]);
}

b[3]=b[3]/a[3][3];
for(i=2;i>=0;i--)
{
c=0;
for(j=i+1;j<4;j++)

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

b[i]=(b[i]-c)/a[i][i];
}
printf("\n");
for(i=0;i<4;i++)
printf("%f ",b[i]);

}

Ⅶ 如何用C語言解決多元一次線性方程

用多重循環,遍歷每個未知數的整數值(從0到9),當方程兩邊相等時,此時的所有循環變數值就是一組解。多元一次方程整數解有多個

Ⅷ 在C語言中怎麼實現輸入線性方程的功能

#include<stdio.h>
#include<math.h>
void main()
{
float x0,x1,x2,fx0,fx1,fx2;
do{
printf("please input x1&x2:");
scanf("%f,%f",&x1,&x2);
fx1=x1*x1*x1*x1*x1*x1-5*x1*x1*x1*x1*x1+3*x1*x1*x1*x1+x1*x1*x1-7*x1*x1+7*x1-20;
fx2=x2*x2*x2*x2*x2*x2-5*x2*x2*x2*x2*x2+3*x2*x2*x2*x2+x2*x2*x2-7*x2*x2+7*x2-20;
}while(fx1*fx2>0);

do
{
x0=(x1+x2)/2;
fx0=x0*x0*x0*x0*x0*x0-5*x0*x0*x0*x0*x0+3*x0*x0*x0*x0+x0*x0*x0-7*x0*x0+7*x0-20;
if((fx0*fx1)>0)
{
fx1=fx0;
x1=x0;
}
else
{
fx2=fx0;
x2=x0;
}

}while(fabs(fx0)>=1e-6);
printf("%f",x0);

}

Ⅸ 有關C語言解線性方程組問題,求解。

看貼吧 或者私信我

Ⅹ 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;
}

熱點內容
如何打開加密ppt 發布:2025-01-05 11:52:01 瀏覽:599
神奇攝影app無法存儲照片 發布:2025-01-05 11:37:42 瀏覽:900
電銷機器人系統源碼 發布:2025-01-05 11:37:41 瀏覽:723
招投標系統源碼 發布:2025-01-05 11:36:57 瀏覽:413
php翻轉字元串 發布:2025-01-05 11:30:20 瀏覽:336
公開密鑰加密系統 發布:2025-01-05 11:25:35 瀏覽:58
安裝mysqlpython 發布:2025-01-05 11:17:02 瀏覽:744
tar備份linux 發布:2025-01-05 11:13:37 瀏覽:729
大型pppoe伺服器搭建 發布:2025-01-05 11:12:59 瀏覽:843
怎麼修改360wifi密碼 發布:2025-01-05 11:12:51 瀏覽:63