计算方法——C语言实现——全主元高斯消元法求解非线性方程

最近在上计算方法这门课,要求是用MATLAB做练习题,但是我觉得C语言也很棒棒啊~

题目:

计算方法——C语言实现——全主元高斯消元法求解非线性方程_第1张图片
高斯消元法是线性方程组的直接解法,可能会造成很大的失真,尤其是高斯顺序消元法,对方法进行改进,使每次都选取绝对值最大的元素为主元,使其为乘数的分母,控制舍入误差的扩大,失真较小。代码都是上上个星期写的,暂时就不注释了……
使用VS2017,代码如下:

//使用全主元高斯消元法求解线性方程组
#include "stdafx.h"
#include
#include "math.h"

double **A, *b, *x;
unsigned int *x_number;
unsigned int RANK = 4;
unsigned int makematrix()
{
	unsigned int r, c;

	printf("请输入矩阵行列数,用空格隔开:");
	scanf_s("%d %d", &r, &c);

	A = (double**)malloc(sizeof(double*)*r);//创建一个指针数组,把指针数组的地址赋值给a ,*r是乘以r的意思
	for (int i = 0; i < r; i++)
		A[i] = (double*)malloc(sizeof(double)*c);//给第二维分配空间
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++)
			A[i][j] = 0.0;
	}

	b = (double*)malloc(sizeof(double)*r);
	for (int i = 0; i < r; i++)
	{
		b[i] = 0.0;
	}
	x = (double*)malloc(sizeof(double)*c);
	for (int i = 0; i < c; i++)
	{
		x[i] = 0.0;
	}
	x_number = (unsigned int*)malloc(sizeof(unsigned int)*c);
	for (int i = 0; i < c; i++)
	{
		x_number[i] = i + 1;
	}

	return r;
}

void getmatrix(void)//输入矩阵并呈现
{
	printf("请按行从左到右依次输入系数矩阵A,不同元素用空格隔开\n");
	for (int i = 0; i < RANK; i++)
	{
		for (int j = 0; j fabs(get_max))
			{
				get_max = AA[i][j];
				get_max_i = i;
				get_max_j= j;				
			}
		}
	}

	if (get_max_i != n - 1)//交换行
	{
		double *temp, temp2;
		temp = AA[get_max_i];
		AA[get_max_i] = AA[n - 1];
		AA[n - 1] = temp;

		temp2 = bb[get_max_i];
		bb[get_max_i] = bb[n - 1];
		bb[n - 1] = temp2;
	}
	if (get_max_j != n - 1)//交换列
	{
		double temp;
		unsigned int temp2;
		for (int i = 0; i < RANK; i++)//系数
		{
			temp = AA[i][get_max_j];
			AA[i][get_max_j] = AA[i][n - 1];
			AA[i][n - 1] = temp;
		}

			temp2 = xx[get_max_j];//x下标
			xx[get_max_j] = xx[n - 1];
			xx[n - 1] = temp2;
	}

	printf("第%d此换序后矩阵如下\n",n);
	for (int i = 0; i < RANK; i++)
	{
		for (int j = 0; j

按设计的提示老老实实 输入题目的系数矩阵和常数向量后,得到运行结果:
计算方法——C语言实现——全主元高斯消元法求解非线性方程_第2张图片计算方法——C语言实现——全主元高斯消元法求解非线性方程_第3张图片
一般来说直接求法是很快的,但是一般来说只用在不大的方程组上,因为失真会不断被放大,那就很扎心了。

你可能感兴趣的:(计算方法)