编写一个Jacobi迭代求解线性方程组的c语言程序并计时
时间: 2024-01-14 09:04:21 浏览: 71
好的,以下是一个Jacobi迭代求解线性方程组的C语言程序,使用了随机生成系数矩阵和常数向量的方法,具体注释见代码中:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100 // 系数矩阵的行数和列数
#define MAX_ITER 100000 // 最大迭代次数
#define TOL 1e-6 // 精度要求
int main() {
// 定义系数矩阵A、常数向量b和解向量x
double A[N][N], b[N], x[N];
// 随机生成系数矩阵A和常数向量b
srand((unsigned)time(NULL));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
A[i][j] = (double)rand() / RAND_MAX * 10.0; // 系数矩阵的元素取值范围为[0, 10)
}
b[i] = (double)rand() / RAND_MAX * 10.0; // 常数向量的元素取值范围为[0, 10)
}
// 初始化解向量x为全0向量
for (int i = 0; i < N; i++) {
x[i] = 0.0;
}
// 迭代求解
clock_t start = clock(); // 记录程序开始时间
int iter = 0; // 迭代次数
double err = TOL + 1.0; // 初始误差
while (iter < MAX_ITER && err > TOL) {
double x_new[N]; // 存储新解向量
err = 0.0; // 记录本次迭代的误差
for (int i = 0; i < N; i++) {
x_new[i] = b[i]; // 先将常数项加入新解向量中
for (int j = 0; j < N; j++) {
if (j != i) {
x_new[i] -= A[i][j] * x[j]; // 减去系数矩阵中除对角线外的元素对应的解向量分量的乘积
}
}
x_new[i] /= A[i][i]; // 除以对角线元素得到新解向量中对应的分量
err += (x_new[i] - x[i]) * (x_new[i] - x[i]); // 计算误差
}
for (int i = 0; i < N; i++) {
x[i] = x_new[i]; // 将新解向量赋值给解向量
}
err = sqrt(err); // 计算误差的平方根
iter++; // 迭代次数加1
}
clock_t end = clock(); // 记录程序结束时间
// 输出结果
printf("Solution:\n");
for (int i = 0; i < N; i++) {
printf("%lf ", x[i]);
}
printf("\n");
printf("Error: %lf\n", err);
printf("Iterations: %d\n", iter);
printf("Time: %lf\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
```
这个程序使用了C语言的标准库函数`time.h`中的`clock()`函数来计时,`CLOCKS_PER_SEC`表示每秒钟的时钟计时单元数。程序首先随机生成系数矩阵和常数向量,然后初始化解向量为全0向量,利用Jacobi迭代方法求解线性方程组,直到达到最大迭代次数或误差小于精度要求为止。程序最后输出结果、误差、迭代次数和程序运行时间。
需要注意的是,由于随机数生成的结果是随机的,所以每次运行程序得到的解向量、误差、迭代次数和程序运行时间都可能不同。
阅读全文