用雅克比迭代法和高斯-赛德尔迭代法求解线性方程组

  • 实验内容

用雅克比迭代法和高斯-赛德尔迭代法求解线性方程组(+小实验 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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值