线性函数c语言编程,线性代数与c语言

c语言如何定义一个线性函数y=kx+b的系数k,b,从键盘读取这两个系数,并读取任意?

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

C语言编写线性表相关的

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

}

用c语言程序写一个函数,求线性代数方程组AX=b,要有通用性。非常感谢帮忙。

高斯-赛德尔迭代法

#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();

}

用c语言编程求线性方程组的解

#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");

}

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

}


名称栏目:线性函数c语言编程,线性代数与c语言
链接分享:http://ybzwz.com/article/hsedhe.html