float k,b,x,y;
创新互联建站是一家专业提供伊美企业网站建设,专注与成都网站制作、成都做网站、外贸营销网站建设、HTML5建站、小程序制作等业务。10年已为伊美众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
printf("请输入k,b:");
scanf("%f%f",k,b);
printf("请输入x:");
scanf("%f",x);
y=k*x十b;
printf("y=%f\n",y);
#include stdio.h
#include malloc.h
#include stdlib.h#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
//typedef struct
//{
// Elemtype *list;
// int size;
// int maxsize;
//}SqList;typedef struct List
{
ElemType *list;
int size;
int maxsize;
}List,*SqlList;typedef struct sNode
{
ElemType data;
struct sNode *next;
}sNode,*LinkList;int InitList_Sq(List L)
{
L.list=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.list)
exit(OVERFLOW);
L.size=0;
L.maxsize=LIST_INIT_SIZE;
return OK;
}int ListInsert_Sq(List L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
if(i1||iL.size+1)
return ERROR;
if(L.size=L.maxsize)
{
newbase=(ElemType *)realloc(L.list,(L.maxsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.list=newbase;
L.maxsize+=LISTINCREMENT;
}
q=(L.list[i-1]);
for(p=(L.list[L.size-1]);p=q;--p)
*(p+1)=*p;
*q=e;
++L.size;
return OK;
}int ListDelete_Sq(List L,int a,int b) /*删除*/
{
ElemType *x,*y;
int j=0;
while(jL.size)//ji-1
{
if(L.list[j]=aL.list[j]=b)
{
x=(L.list[j]);//要删除的数
y=L.list+L.size-1;
for(++x;x=y;++x)
*(x-1)=*x;
--L.size;
}
else
++j;
}
/*if(!p||ji-1)
return ERROR;*/ /*int i;
ElemType *p;
if(i1||iL.size)
return ERROR;
p=(L.list[i-1]);
e=*p;
q=L.list+L.size-1;
for(++p;p=q;++p)
*(p-1)=*p;
--L.size;*/
return OK;
}
int ListDestory_Sq(List L)
{
free(L.list);
L.size=0;
return OK;
}int InitList_Link(LinkList L,int n)
{
int i;
LinkList p;
L=(LinkList)malloc(sizeof(sNode));
L-next=NULL;
/*for(i=n;i0;--i)
p=(LinkList)malloc(sizeof(sNode));
scanf("%d",p-data);
p-next=L-next;
L-next=p;*/
return OK;
}int ListInsert_Link(LinkList L,int i,ElemType e)
{
LinkList p=L,s;
int j=0;
while(pji-1)
{
p=p-next;
++j;
}
if(!p||ji-1)
return ERROR;
s=(LinkList)malloc(sizeof(sNode));
s-data=e;
s-next=p-next;
p-next=s;
return OK;
}
int ListDelete_Link(LinkList L,int i,ElemType e)
{
LinkList p=L,q;
int j=0;
while(p-nextji-1)
{
p=p-next;
++j;
}
if(!(p-next)||ji-1)
return ERROR;
q=p-next;
p-next=q-next;
e=q-data;
free(q);
return OK;
}
int ListDestory_Link(LinkList L)
{
LinkList p,r=L;
p=L-next;//L为头结点
while(p)
{
r-next=p-next;
free(p);
p=r-next;
}
return OK;
}int CountEqualx(LinkList L,int x)
{
int sum=0;
LinkList p;
p=L-next;//L为头结点
while(p)
{
if(p-data==x)
sum++;
p=p-next;
}
return sum;
}int SelectMax(LinkList L)
{
int max;
LinkList p=L-next;
if(p)
{
//p=L-next;//L为头结点
max=p-data;
while(p)
{
if(p-datamax)
max=p-data;
p=p-next;
}
return max;
}
else
{
printf("\n链表为空!\n");
exit(1);
}
}int main()
{
int i,j,a,b,x;
List L;
LinkList Link,p;
ElemType e; //顺序表操作
InitList_Sq(L);
for(i=0;i10;i++)
ListInsert_Sq(L,1,i);//在第1个位置插入i
printf("\n顺序表删除前: ");
for(i=0;iL.size;i++)
printf("%d ",L.list[i]);
printf("\n输入a的值:\na=");
scanf("%d",a);
printf("\n输入b的值:\nb=");
scanf("%d",b);
ListDelete_Sq(L,a,b); //删除大于等于a 小于等于b的数
printf("\n顺序表删除后: ");
for(i=0;iL.size;i++)
printf("%d ",L.list[i]);
printf("\n"); //链表操作
InitList_Link(Link,10);
for(i=0;i10;i++)
ListInsert_Link(Link,1,i);//在第1个位置插入i
printf("\n链表最大元素为:%d\n",SelectMax(Link));
printf("\n输入x:");
scanf("%d",x);
printf("\n链表中元素等于x的值有%d个\n",CountEqualx(Link,x));
printf("\n链表删除前: ");
p=Link-next;//L为头结点
while(p)
{
printf("%d ",p-data);
p=p-next;
} printf("\n删除第几个元素:");
scanf("%d",x); ListDelete_Link(Link,x,e);
printf("\n链表删除后: ");
p=Link-next;//L为头结点
while(p)
{
printf("%d ",p-data);
p=p-next;
}
printf("\n链表删除的元素为: %d\n",e);
ListDestory_Sq(L);
ListDestory_Link(Link);
system("pause");
return 0;
}
高斯-赛德尔迭代法
#include stdio.h
#include conio.h
#include alloc.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( "迭代发散\n ");
exit(1);
}
nu++;
}
while(fabs(dx) 1e-6);
return x;
}
main()
{
int i;
float *x;
float c[12]={5,2,1,8,2,8,-3,21,1,-3,-6,1};
float *GauseSeidel(float *,int);
x=GauseSeidel(c,3);
clrscr();
for(i=0;i =2;i++)
printf( "x[%d]=%f\n ",i,x[i]);
getch();
}
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
int rgauss(n,a,b)
int n;
double a[],b[];
{ int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for (k=0;k=n-2;k++)
{ d=0.0;
for (i=k;i=n-1;i++)
for (j=k;j=n-1;j++)
{ t=fabs(a[i*n+j]);
if (td) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0;
else
{ if (js[k]!=k)
for (i=0;i=n-1;i++)
{ p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (is!=k)
{ for (j=k;j=n-1;j++)
{ p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i=n-1;i++)
{ for (j=k+1;j=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i=0;i--)
{ t=0.0;
for (j=i+1;j=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}
徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入的.
我也写过一个,不过估计你不太喜欢用我的,这个用来解b也是矩阵的.
#include stdio.h
#include stdlib.h
#include math.h
void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
void printMatrix(int n,int m,double **a){
int i,j;
for (i=0;in;i++){
for (j=0;jm;j++) printf("%e\t",a[i][j]);
printf("\n");
}
}
int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k;
double d,t;
// *det=1;
s=0;
colex=malloc(n*sizeof(int));
for (k=0;kn;k++){
d=0.0;
for (i=k;in;i++){
for (j=k;jn;j++){
t=fabs(a[i][j]);
if (td){
d=t;
colex[k]=j;
rowex=i;
}
}
}
if (d+1.0==1.0){
free(colex);
printf("Singular Matrix!\n");
return 0;
}
else{
if (colex[k]!=k){
for (i=0;in;i++)
swap(a[i]+colex[k],a[i]+k);
s=s+colex[k]-k;
}
if (rowex!=k){
for (j=0;jn;j++)
swap(a[rowex]+j,a[k]+j);
for (j=0;jm;j++)
swap(b[rowex]+j,b[k]+j);
s=s+rowex-k;
}
}
d=a[k][k];
// *det=*det*d;
for (j=k+1;jn;j++) a[k][j]/=d;
for (j=0;jm;j++) b[k][j]/=d;
for (i=k+1;in;i++){
for (j=k+1;jn;j++)
a[i][j]-=a[i][k]*a[k][j];
for (j=0;jm;j++)
b[i][j]-=a[i][k]*b[k][j];
}
}
for (i=n-2;i-1;i--)
for (j=i+1;jn;j++)
for (k=0;km;k++)
b[i][k]-=a[i][j]*b[j][k];
colex[n-1]=n-1;
for (i=n-1;i-1;i--)
if (colex[i]!=i)
for (j=0;jm;j++) swap(b[colex[i]]+j,b[i]+j);
// if (s1) *det=-*det;
return 1;
}
void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2};
double input_b[]={1,2};
double *a[N],*b[N];
int i;
for (i=0;iN;i++){
a[i]=input_a+N*i;
b[i]=input_b+M*i;
}
rgauss(N,M,a,b);
printf("方程解为:\n");
printMatrix(N,M,b);
printf("\n");
}
以下算法的适用条件: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; in; i++)
for (j=0; jn; j++)
scanf("%lf", a[i][j]);
printf("Now input the matrix b(i), i = 0, ..., %d:\n", n-1);
for(i=0; in; i++)
scanf("%lf", b[i]);
// }} 程序输入
for(i=0; in; i++)
u[i][i] = 1; //
for(k=0; kn; k++)
{
for(i=k; in; 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; jn; 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; in; 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; jn; j++)
x[i] -= (u[i][j]*x[j]);
}
printf("Solve...x_i = \n"); // 输出结果
for(i=0; in; i++)
printf("%f\n", x[i]);
return 0;
}