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