C编程解线性代数二阶三阶矩阵(奇迹冬瓜)

(一)

小编语

    大学数学三大基础:概论,线性,高数,用计科系软件角度运用数学观点理论编写程序来解决作业是一个极富创造力的工程,现在就线性代数第一章的理论来进行程序(c基础语言)的编写以求达到简化作业的目的,当然,最终目的还是为了睡个好觉,首先进行这个课题的理论积累。

(二)

    二阶行列式理论基础

    二阶行列式推导过程:

    ①a11x1+a12x2=b1

    ②a21x1+a22x2=b2

    由一二式的推导

    ①*a21:a11a21x1+a12a21x2=b1a21

    ②*a11:a11a21x1+a11a22x2=b2a11

    ①-②:(a12a21-a11a22)x2=b1a21-b2a11

    当a12a21-a11a22≠0时

    x1=(b1a21-b2a11)/(a12a21-a11a22)

    x2=(b2a12-b1a22)/(a12a21-a11a22)

    那么二阶行列式

    | a11 a12 |           | b1 a12 |           | a11 b1 | 

    | a21 a22 |           | b2 a22 |           | a21 b2 | 

    其中a叫做元素(element),下标分别表示行与列,简称行标与列标,系数行列式(D):由对角线法则得D=a11a22-a12a21

    同理得D1=b1a22-a12b2  D2=a11b2-b1a21

    于是乎x1=D1/D  x2=D2/D

    (三)

     二阶编程代码

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

void main()
{
	float arr[2][3],D1,D2,D;
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<3;j++)
		{
			scanf("%f",&arr[i][j]);
		}
	}
	D=arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0];
	if(0!=D)
	{
		D1=arr[0][2]*arr[1][1]-arr[0][1]*arr[1][2];
		D2=arr[0][0]*arr[1][2]-arr[0][2]*arr[1][0];
	}
	else
	{
		exit(0);
	}
	printf("x1:%-5.2f x2:%-5.2f\n",D1/D,D2/D);
	getchar();
	getchar();
}

程序测试:

线性代数第一章例一:

3x1-2x2=12

2x1+x2=1

 C编程解线性代数二阶三阶矩阵(奇迹冬瓜)_第1张图片

(四)

三阶行列式理论与代码

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

#define N 3

void Exchange(float (*p)[N],int i,float *q);
float MainDgl(float (*s)[N]);
float ViceDgl(float (*s)[N]);


void main()
{
	float arr[N][N],b[N],D1[N],D;
	int i,j;
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			scanf("%f",&arr[i][j]);
		}

	}
	D=MainDgl(arr)-ViceDgl(arr);
	printf("D:%-5.3f ",D);
	printf("\n");
	getchar();
	getchar();
}

void Exchange(float (*p)[N],int i,float *q)
{
	int j=0;
	float temp;
	for(;j<N;j++)
	{
		temp=p[i][j];
		p[i][j]=q[j];
		q[j]=temp;
	}
}

float MainDgl(float (*s)[N])
{
	float m=1,sum=0;
	int i=0,j=0,k=1,start=0,end=N-1;
	while(start<=end)
	{
		m*=s[i++][j++];
		if(i==N)
		{
			i=0;
		}
		if(j==N)
		{
			j=0;
		}
		if(0==k%N)
		{
			sum+=m;
			m=1;
			i=0;
			j=++start;
		}
		k++;
	}
	return sum;
}

float ViceDgl(float (*s)[N])
{
	float m=1,sum=0;
	int i=0,j=N-1,k=1,start=N-1,end=0;
	while(start>=end)
	{
		m*=s[i++][j--];
		if(i==N)
		{
			i=0;
		}
		if(j==-1)
		{
			j=N-1;
		}
		if(0==k%N)
		{
			sum+=m;
			m=1;
			i=0;
			j=--start;
		}
		k++;
	}
	return sum;
}

以第五版线性代数的作业作为测试:

习题一p25

第一大题(1)

|   2   0   1   |

|   1  -4  -1  |

|  -1   8   3  |

测试结果:

你可能感兴趣的:(C编程解线性代数二阶三阶矩阵(奇迹冬瓜))