用雅克比迭代法和高斯-赛德尔迭代法求解线性方程组(+小实验 4) (大实验见 p314,实验 4 解线性方程组的迭代法(1)(2) 【小实验 4】 设计实现停车场计费程序; (1)计算出从车辆入场时间到离场时间之间的时间差,传入的时间格式(如:2023-10- 01 16:10:32),计算出的时间是以小时为单位。 (2)根据步骤 1 计算出的时间来划分收费标准。如果连续停车时长大于 24*20 小时 (20 天)则采用按月收费标准(1000 元/月),避免按天收费来造成用户负担更多的停车费 用;如果连续停车时长>=24 小时且=12 小时并且小于 24 小时的话,那么按小时收费标准收费;如果停车时长小于等于 12 小时,那么按照以下方式来进行处理: ①判断停车的时间是否在白天的 07:00-19:00 之间。如果在这个时间范围内:再判断这 个停车时长是否在半小时以内,半小时免费停车;超过半小时而<=10 小时,按 3 元/小时 收费;如果时长大于 10 小时且小于等于 12 小时,则按白天 12 小时停车(白天停车 30 元 /车)。 ②判断停车时间是否在晚上 19:00 到第二天 07:00 之间。如果在这个时间范围内:判断 夜晚停车时长是否在半小时以内,半小时免费停车;超过半小时而<=4 小时,按 2.5 元/小 时收费;大于 4 小时且小于等于 12 小时,则按夜晚 12 小时收费标准收费(夜晚停车 20 元 /车)。 ③ 如果停车时间是在横跨白天和夜晚停车,但停车时长小于等于 12 小时的话,那么 按昼夜交替停车标准来进行收费
#include <iostream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string> #include <string.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> #include <iomanip> using namespace std; typedef long long LL; const int INF = 0x7fffffff; const int MAXN = 1000; const double wucha = 0.0001; const int MAX_count = 500; double A[MAXN][MAXN]; double b[MAXN]; double curx[MAXN]; double lastx[MAXN]; int N, Count; double W; void init() { printf("输入未知数个数:"); cin >> N; printf("输入方程组矩阵A:\n"); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { cin >> A[i][j]; } } printf("输入b向量:\n"); for (int i = 1; i <= N; i++) { cin >> b[i]; } cout << endl; } void initx() { // memset(curx,-1,sizeof(curx)); cout << "请对x赋初值:" << endl; for (int i = 1; i <= N; i++) { cin >> curx[i]; } } bool judge() { double sum = 0; for (int i = 1; i <= N; i++) { sum += (curx[i] - lastx[i]) * (curx[i] - lastx[i]); } sum = sqrt(sum); if (sum <= wucha)return 1; else return 0; } void shuchux() { cout << "迭代次数为:" << Count << endl; cout << "近似解为:"; for (int i = 1; i <= N; i++) { cout << curx[i] << " "; } cout << endl << endl; } void Jacobi() {//x初值都设置为0 cout << "雅可比迭代法:" << endl; initx(); int flag = 0; double sum; for (int k = 1; k < MAX_count; k++) { for (int i = 1; i <= N; i++) { lastx[i] = curx[i]; } for (int i = 1; i <= N; i++) { sum = 0; for (int j = 1; j <= N; j++) { if (i == j)continue; sum += A[i][j] * lastx[j]; } curx[i] = (b[i] - sum) / A[i][i]; } if (judge()) { flag = 1; Count = k; shuchux(); break; } } if (flag == 0)cout << "error!" << endl << endl; } void gaisi_saideer() { cout << "高斯—赛德尔迭代法:" << endl; initx(); int flag = 0; double sum; double t; for (int k = 1; k < MAX_count; k++) { double e = 0; for (int i = 1; i <= N; i++) { t = curx[i]; sum = 0; for (int j = 1; j <= N; j++) { if (i == j)continue; sum += A[i][j] * curx[j]; } curx[i] = (b[i] - sum) / A[i][i]; if (fabs(curx[i] - t) <= e) {} else { e = fabs(curx[i] - t); } } if (e < wucha) { flag = 1; Count = k; shuchux(); break; } } if (flag == 0)cout << "error!" << endl << endl; } void SOR() { cout << "逐次超松弛迭代法(SOR):" << endl; initx(); cout << "输入松弛因子W:" << endl; cin >> W; int flag = 0; double sum1, sum2; for (int k = 1; k < MAX_count; k++) { for (int i = 1; i <= N; i++) { lastx[i] = curx[i]; if (k == 1)curx[i] = 0; } for (int i = 1; i <= N; i++) { sum1 = 0, sum2 = 0; for (int j = 1; j <= i - 1; j++) { sum1 += A[i][j] * curx[j]; // cout<<curx[j]<<" "; } // cout<<endl; for (int j = i; j <= N; j++) { sum2 += A[i][j] * lastx[j]; } curx[i] = (b[i] - sum1 - sum2) * W / A[i][i] + lastx[i]; } if (judge()) { flag = 1; Count = k; shuchux(); break; } } if (flag == 0)cout << "error!" << endl << endl; } int main() { while (1) { init(); Jacobi(); gaisi_saideer(); SOR(); SOR(); SOR(); } return 0; } |
通过这次实验的学习,我对利用雅克比迭代法和高斯-赛德尔迭代法解题更加熟练 |
10-21
1435