c語言求方程組
『壹』 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語言編寫三元二次方程組的求解
你都已經把x y z的公式寫出來了,我就直接用了。
#include <stdio.h>
int main(){
int a,b,c,d1,d2,d3,d4;
double x,y,z;
printf("請輸入a b c d1 d2 d3 d4:\n");
scanf("%d %d %d %d %d %d %d",&a,&b,&c,&d1,&d2,&d3,&d4);
//乘以1.0是為了將整數轉成浮點數,C語言的整數相除,結果只取整數部分
x=(d4*d4+a*a-d1*d1)*1.0/(a*2*1.0);
y=(d4*d4+b*b-d2*d2)*1.0/(b*2*1.0);
z=(d4*d4+c*c-d3*d3)*1.0/(2*c*1.0);
printf("x=%d y=%d z=%d\n",x,y,z);
return 0;
}
『叄』 如何用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;
} 輸入系數,就可以計算了
『肆』 如何用c語言解線形方程組
#include <iostream.h>
#include <math.h>
void main(){
double A[36][5];//實驗數據的系數矩陣
double mid_change[36]={1.23,1.06,0.99,1.08,0.95,1.12,1.23,1.05,1.30,0.98,0.87,0.94,1.10,1.14,1.20,0.89,1.25,1.20,0.98,0.99,1.01,0.99,0.96,0.87,0.88,0.83,0.90,0.96,0.85,1.01,1.05,1.09,0.95,1.25,0.84,0.95};
double x[5];//未知數矩陣,最後的解就放在這里
double b[36];//等式右邊的全部為1的向量
double parA[5][5],parb[5];//最後用來計算的矩陣
int i,j,k;
int label;
double mid=0;
//在這里你需要做的是初始化的工作,對A矩陣進行初始化,下面用的A矩陣是已經賦值過的了,
//同樣b向量也是初始化為1的向量,x向量初始化為0
for (i=0;i<36;i++){
A[i][0]=(cos(i/18.0*3.14159265758)*mid_change[i])*(cos(i/18.0*3.14159265758)*mid_change[i]);
}
for (i=0;i<36;i++){
A[i][1]=(sin(i/18.0*3.14159265758)*mid_change[i])*(sin(i/18.0*3.14159265758)*mid_change[i]);
}
for (i=0;i<36;i++){
A[i][2]=(cos(i/18.0*3.14159265758)*mid_change[i])*(sin(i/18.0*3.14159265758)*mid_change[i]);
}
for (i=0;i<36;i++){
A[i][3]=cos(i/18.0*3.14159265758)*mid_change[i];
}
for (i=0;i<36;i++){
A[i][4]=sin(i/18.0*3.14159265758)*mid_change[i];
b[i]=1;
}
for (i=0;i<5;i++) x[i]=0;
//下面對parA矩陣,parb向量進行初始化賦值
for (i=0;i<5;i++){
for (j=0;j<5;j++){
mid=0;
for (k=0;k<36;k++){
mid+=A[k][i]*A[k][j];
}
parA[i][j]=mid;
}
}
for (i=0;i<5;i++){
mid=0;
for (j=0;j<36;j++){
mid+=A[j][i]*b[j];
}
parb[i]=mid;
}
for (i=0;i<5;i++){
for (j=0;j<5;j++) cout<<parA[i][j]<<" ";
cout<<parb[i]<<endl;
}
/* for (i=0;i<5;i++){
mid=0;
for (j=0;j<36;j++) mid+=A[j][i]*2*b[j];
parb[i]=mid;
for (j=0;j<5;j++){
mid=0;
for (k=0;k<36;k++){
mid+=A[k][i]*A[k][j]*2;
}
parA[i][j]=mid;
}
}
*/
//對par和b組成的增廣矩陣進行列主元消去法求解。
for (i=0;i<4;i++){
mid=fabs(parA[i][i]);
label=i;
//下面找列主元
for (k=i+1;k<5;k++){
if (fabs(parA[k][i])>mid){
label=k;
mid=fabs(parA[k][i]);
}
}
//判斷矩陣的秩
if (mid<=0.000001){
cout<<"由於系數矩陣的秩小於行數,不能進行方程組的求解。\n";
return;
}
//交換主元
if (label!=i){
cout<<"change\n";
for (j=0;j<5;j++){
mid=parA[i][j];
parA[i][j]=parA[label][j];
parA[label][j]=mid;
}
mid=parb[i];
parb[i]=parb[label];
parb[label]=mid;
}
//開始消元
//標准化第i行
parb[i]=parb[i]/parA[i][i];
for (j=4;j>=0;j--){
parA[i][j]=parA[i][j]/parA[i][i];
}
//消b
for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
//消par
for (j=i+1;j<5;j++){
for (k=5;k>i;k--){
parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
}
}
//列主元消元完成
}
for (i=0;i<5;i++){
for (j=0;j<5;j++) cout<<parA[i][j]<<" ";
cout<<parb[i]<<endl;
}
//下面回代求解
for (i=4;i>=0;i--){
mid=0;
for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
x[i]=(parb[i]-mid)/parA[i][i];
}
//輸出結果
for (i=0;i<5;i++) cout<<x[i]<<endl;
}
『伍』 如何用C語言程序解方程
#include"stdio.h"
#include"math.h"
/*求一元二次方程ax*x+bx+c=0的解*/
main()
{
floata,b,c,x1,x2,d;
printf("請輸入a:");
scanf("%f",&a);
printf("請輸入b:");
scanf("%f",&b);
printf("請輸入c:");
scanf("%f",&c);
d=b*b-4*a*c;
if(d<0)
printf("方程沒有實數解。 ");
if(d==0)
{
x1=(-b)/(2*a);
printf("x1=%f ",x1);
}
if(d>0)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("x1=%f,x2=%f ",x1,x2);}
}
請輸入a:12
請輸入b:34
請輸入c:4
x1=-0.122985,x2=-2.710348
Pressanykeytocontinue
『陸』 用C語言編程二分法求解方程組
#include<stdio.h>
#include<math.h>
#define EQUATION(A, B, m, n, x) (A*pow(x, m) + B*pow(x, n) - 1)/* 定義方程*/
double A, B, m, n;/*方程參數*/
void find_extent(double *x1, double *x2)/*找出根所在的區間*/
{
double i = 0, j = 0;
*x1 = 0;
if(EQUATION(A, B, m, n, 0) > 0)
{
while(EQUATION(A, B, m, n, ++i) > 0 && EQUATION(A, B, m, n, --j) > 0);
*x2 = EQUATION(A, B, m, n, i) <= 0 ? i : j;
}
else
{
while(EQUATION(A, B, m, n, ++i) < 0 && EQUATION(A, B, m, n, --j) < 0);
*x2 = EQUATION(A, B, m, n, i) >= 0 ? i : j;
}
}
/*二分法解方程*/
/*輸入參數:根所在區間[x1, x2], 和精度*/
double get_result(double x1, double x2, double accuracy)
{
double x = (x1 + x2) / 2;
while(fabs(EQUATION(A, B, m, n, x)) > accuracy)
{
if(EQUATION(A, B, m, n, x) * EQUATION(A, B, m, n, x1) > 0)
x1 = x;
else
x2= x;
x = (x1 + x2)/2;
}
return x;
}
int main()
{
double x;
double x1,x2;
scanf("%lf%lf%lf%lf", &A, &B, &m, &n);
find_extent(&x1, &x2);
x = get_result(x1, x2, 0.00001);
printf("%lf", x);
return 0;
}
『柒』 C語言計算這個方程組,怎麼寫
#include
<stdio.h>
int
main
()
{
double
a1,a2,a3;
double
b1,b2,b3;
char
cx1,cx2;
char
cy1,cy2;
char
dh;
double
sumx,sumy;
printf("請輸入一個表達式:");
scanf("%lf%c%lf%c%c%lf",&a1,&cx1,&a2,&cy1,&dh,&a3);
printf("請輸入另一個表達式:");
scanf("%lf%c%lf%c%c%lf",&b1,&cx2,&b2,&cy2,&dh,&b3);
printf("a1=%lf\na2=%lf\na3=%lf\nb1=%lf\nb2=%lf\nb3=%lf\n",a1,a2,a3,b1,b2,b3);
sumy=(b3*a1-a3*b1)/(a1*b2-a2*b1);
printf("y=%lf\n",sumy);
sumx=(a3-a2*sumy)/a1;
printf("x=%lf\n",sumx);
return
0;
}
/*
系數為1時,要寫上
請輸入一個表達式:1x-1y=22.5
請輸入另一個表達式:10x-1y=0
a1=1.000000
a2=-1.000000
a3=22.500000
b1=10.000000
b2=-1.000000
b3=0.000000
y=-25.000000
x=-2.500000
*/
『捌』 C語言編程題調用函數求解方程組,a1x+b1y=c1,a2x+b2y=c2
#include<stdio.h>
double
val(double
a00,double
a11,double
a01,double
a10)
{
return
a00*a11-a01*a10;
}
void
main()
{
double
a1,b1,c1,a2,b2,c2;
double
m1,m2,m3;
printf("Please
input
a1,b1,c1\n");
scanf("%lf%lf%lf",&a1,&b1,&c1);
printf("Please
input
a2,b2,c2\n");
scanf("%lf%lf%lf",&a2,&b2,&c2);
m1
=
val(a1,b2,a2,b1);
m2
=
val(c1,b2,c2,b1);
m3
=
val(c1,a2,c2,a1);
if(m1==0){
if(m2==0
&&
m3==0)
printf("無數解\n");
else
printf("無解\n");
}else
printf("x=%lf,y=%lf\n",m2/m1,-m3/m1);
}
這個是先求行列式的值,然後判斷其是否為0,討論解的情況,當有唯一解的時候,輸出x和y的值。
val()函數用於計算2x2行列式的值。
有不明白的地方可以追問,望採納:)
『玖』 如何用C語言解二元一次方程組
設計思路如下:
1、問題描述:
給定一個二元一次方程組,形如:
a * x + b * y = c;
d * x + e * y = f;
x,y代表未知數,a, b, c, d, e, f為參數。
求解x,y。
2、數據規模和約定:
0 <= a, b, c, d, e, f <= 2147483647。
3、設計思路:
二元一次方程組是由兩個含有兩個未知數的方程組成的,要求解,就要把二元轉化為一元。由二元一次方程組的解法思想知,要把二元轉化為一元.
實現的功能代碼如下:
因為在求解過程中只有數之間的運算,而沒有整個式子的運算,因此這種方法被廣泛地用於計算機中。
『拾』 三元一次方程組 公式 c語言
不知你那公式怎麼來的,建議採用線性代數的克萊姆方法來解:
為方便和完善期間,增加一個變數H,把x=,y=,z=那三行和後面那一行
替換為:
H=a*(B*g-C*f)-A*(b*g-c*f)+e*(b*C-c*B);
if(H==0) printf("次方程組無解!");
else
{x=(d*(B*g-C*f)-D*(b*g-c*f)+h*(b*C-c*B))/H;
y=(d*(A*g-C*e)-D*(a*g-c*e)+h*(a*C-c*A))/H;
z=(d*(A*f-B*e)-D*(a*f-b*e)+h*(a*B-b*A))/H;
printf("%lf\n%lf\n%lf",x,y,z);}
試驗一下,不行再問。其實你的變數設置不大好,為了盡量保持原貌,未做改動。