请修改程序并加以补充

img

img

img

img

img


想要求出最小的aim,但是程序报错,而且想求出最小的aim对应的b11,b21,c0和c3

#include <stdio.h>

int main()
{
    int m[13] = { 41,45,62,121,198,291,440,571,830,1287,1975,2744,4515 };//第一阶段的确诊感染者的实际值
    int e[13];//第一阶段的潜伏期感染者
    int n[13];//第一阶段的确诊感染者的估计值
    int E[7] = {41,45,62,121,198,291,440};//假定在1月15号前七天的感染人数
    int i,j,b11,c0,b21,c3,aim;
    b11 = 0;
    b21 = 0;
    c0 = 0;
    c3 = 0;
    aim = 0;
    n[0] = 41;
    e[0] = 571;
    for (i = 0; i < 151807041; i++)
    {
        for (b11; b11 <= 1; b11 = b11 + 0.01)
        {
            for (b21; b21 <= 1; b21 = b21 + 0.01)
            {
                for (c0; c0 <= 10; c0 = c0 + 0.1)
                {
                    for (c3; c3 <= 10; c3 = c3 + 0.1)
                    {
                        for (i = 1; i < 13; i++)
                        {
                            if (i >= 8)
                            {
                                n[i] = n[i - 1] + b11 * c0 * n[i - 8] + b21 * c3 * e[i - 8];
                                e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1]
                                    - b21 * c3 * e[i - 8];
                            }
                            else
                            {
                                n[i] = n[i - 1] + b21 * c3 * E[i - 1];
                                e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1]
                                    - b21 * c3 * E[i - 1];
                            }
                            for (i = 0; i < 13; i++)
                            {
                                aim = (e[i] - n[i]) * (e[i] - n[i]) + aim;
                            }
                        }
                        
                    }
                }
            }
        }
    printf("%d\n", aim);
    
    return 0;
}

把代码给一下吧,截屏不容易看......尤其是这么多嵌套

直接贴出来吧

输出方法 printf 上面少了个 “ } ”,还有你嵌套循环这么多层不知道你要模拟啥,算不出来的,你算下最里层代码要执行多少次,万亿级别了吧;

以下参考自ChatGPT:
在你的代码中,有几个问题需要修改和补充:

  1. 需要给循环中的变量初始化一个合适的值,例如将 b11b21c0c3 初始化为 0.0

  2. 在第一个循环结束后,需要将 b21c3 重置为 0.0,以便下一次循环从 0.0 开始。

  3. 在内部的循环中,需要将结果变量 aim 初始化为 0,以便在每次内部循环开始时重新计算。

修改后的代码如下:

#include <stdio.h>
#include <math.h>

int main()
{
    int m[13] = { 41,45,62,121,198,291,440,571,830,1287,1975,2744,4515 };//第一阶段的确诊感染者的实际值
    int e[13];//第一阶段的潜伏期感染者
    int n[13];//第一阶段的确诊感染者的估计值
    int E[7] = {41,45,62,121,198,291,440};//假定在1月15号前七天的感染人数
    int i,j;
    double b11,c0,b21,c3,aim;
    b11 = 0.0;
    b21 = 0.0;
    c0 = 0.0;
    c3 = 0.0;
    aim = 0.0;
    n[0] = 41;
    e[0] = 571;
    for (i = 0; i < 151807041; i++)
    {
        for (b11 = 0.0; b11 <= 1.0; b11 = b11 + 0.01)
        {
            for (b21 = 0.0; b21 <= 1.0; b21 = b21 + 0.01)
            {
                for (c0 = 0.0; c0 <= 10.0; c0 = c0 + 0.1)
                {
                    for (c3 = 0.0; c3 <= 10.0; c3 = c3 + 0.1)
                    {
                        for (j = 1; j < 13; j++)
                        {
                            if (j >= 8)
                            {
                                n[j] = n[j - 1] + b11 * c0 * n[j - 8] + b21 * c3 * e[j - 8];
                                e[j] = e[j - 1] + b11 * c0 * n[j - 1] + b21 * c3 * e[j - 1]
                                    - b21 * c3 * e[j - 8];
                            }
                            else
                            {
                                n[j] = n[j - 1] + b21 * c3 * E[j - 1];
                                e[j] = e[j - 1] + b11 * c0 * n[j - 1] + b21 * c3 * e[j - 1]
                                    - b21 * c3 * E[j - 1];
                            }
                        }

                        aim = 0.0;
                        for (j = 0; j < 13; j++)
                        {
                            aim += pow(e[j] - n[j], 2);
                        }
                    }
                }
            }
        }
    }
    printf("%lf\n", aim);

    return 0;
}

这样修改后的代码应该可以正常运行。注意,循环的嵌套层级很深,因此运行时间可能非常长。你可以根据实际情况适当缩小循环的范围来加快运行速度。另外,我还对计算 aim 的方式进行了修改,使用了平方来避免负数的出现。

【以下回答由 GPT 生成】

该程序中存在一些问题,需要进行修改。首先,程序中的嵌套循环无法准确计算出目标值,其次,程序中的aim、b11、b21、c0和c3都应该为浮点型,而不是整型。以下是修改后的代码:

#include <stdio.h>
#include <math.h>

int main()
{
    double m[13] = { 41, 45, 62, 121, 198, 291, 440, 571, 830, 1287, 1975, 2744, 4515 }; // 第一阶段的确诊感染者的实际值
    double e[13]; // 第一阶段的潜伏期感染者
    double n[13]; // 第一阶段的确诊感染者的估计值
    int E[7] = { 41, 45, 62, 121, 198, 291, 440 }; // 假定在1月15号前七天的感染人数
    double b11, c0, b21, c3, aim;

    b11 = 0;
    b21 = 0;
    c0 = 0;
    c3 = 0;
    aim = 0;
    n[0] = 41;
    e[0] = 571;

    double minAim = m[12]; // 初始化最小aim值为最后一个实际值
    double minB11, minC0, minB21, minC3; // 最小aim值对应的b11、b21、c0和c3的值

    for (b11 = 0; b11 <= 1; b11 += 0.01)
    {
        for (b21 = 0; b21 <= 1; b21 += 0.01)
        {
            for (c0 = 0; c0 <= 10; c0 += 0.1)
            {
                for (c3 = 0; c3 <= 10; c3 += 0.1)
                {
                    for (int i = 1; i < 13; i++)
                    {
                        if (i >= 8)
                        {
                            n[i] = n[i - 1] + b11 * c0 * n[i - 8] + b21 * c3 * e[i - 8];
                            e[i] = e[i - 1] + b11 * c0 * n[i - 8] + b21 * c3 * e[i - 8];
                        }
                    }
                }

                aim = fabs(n[12] - m[12]); // 计算aim的绝对值

                // 如果当前aim值比最小aim值更小,则更新最小aim和对应的参数值
                if (aim < minAim)
                {
                    minAim = aim;
                    minB11 = b11;
                    minC0 = c0;
                    minB21 = b21;
                    minC3 = c3;
                }
            }
        }
    }

    // 输出结果
    printf("最小的aim值为:%f\n", minAim);
    printf("对应的b11值为:%f\n", minB11);
    printf("对应的b21值为:%f\n", minB21);
    printf("对应的c0值为:%f\n", minC0);
    printf("对应的c3值为:%f\n", minC3);

    return 0;
}

解决方案的思路是使用四个嵌套循环遍历b11、b21、c0和c3的所有可能取值,并计算对应的n和e。在每次内层循环后,计算当前aim值,并判断是否比最小aim值更小,如果是,则更新最小aim值以及对应的参数值。最后输出结果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

输出方法 printf 上面少了个 “ } ”,还有你嵌套循环这么多层不知道你要模拟啥,算不出来的,你算下最里层代码要执行多少次,万亿级别了吧;

#include <stdio.h>
 
int main() {
    int m[13] = { 41,45,62,121,198,291,440,571,830,1287,1975,2744,4515 }; // 第一阶段的确诊感染者的实际值
    int e[13]; // 第一阶段的潜伏期感染者
    int n[13]; // 第一阶段的确诊感染者的估计值
    int E[7] = { 41,45,62,121,198,291,440 }; // 假定在115号前七天的感染人数
 
    float b11, b21, c0, c3; // 修改为浮点数类型的参数
    int aim = 0;
    
    n[0] = 41;
    e[0] = 571;
 
    for (b11 = 0; b11 <= 1; b11 += 0.01) {
        for (b21 = 0; b21 <= 1; b21 += 0.01) {
            for (c0 = 0; c0 <= 10; c0 += 0.1) {
                for (c3 = 0; c3 <= 10; c3 += 0.1) {
                    for (int i = 1; i < 13; i++) {
                        if (i >= 8) {
                            n[i] = n[i - 1] + b11 * c0 * n[i - 8] + b21 * c3 * e[i - 8];
                            e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1] - b21 * c3 * e[i - 8];
                        }
                        else {
                            n[i] = n[i - 1] + b21 * c3 * E[i - 1];
                            e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1] - b21 * c3 * E[i - 1];
                        }
                        
                        aim += (e[i] - n[i]) * (e[i] - n[i]);
                    }
                }
            }
        }
    }
 
    printf("%d\n", aim);
 
    return 0;
}

#include <stdio.h>
#include <math.h>

int main()
{
    int m[13] = { 41,45,62,121,198,291,440,571,830,1287,1975,2744,4515 };//第一阶段的确诊感染者的实际值
    int e[13];//第一阶段的潜伏期感染者
    int n[13];//第一阶段的确诊感染者的估计值
    int E[7] = {41,45,62,121,198,291,440};//假定在1月15号前七天的感染人数
    int i,j;
    double b11,c0,b21,c3,aim; //将变量改为双精度浮点型
    n[0] = 41;
    e[0] = 571;
    for (b11 = 0; b11 <= 1; b11 = b11 + 0.01) //将b11的初始值设为常量
    {
        for (b21 = 0; b21 <= 1; b21 = b21 + 0.01) //同理
        {
            for (c0 = 0; c0 <= 10; c0 = c0 + 0.1) //同理
            {
                for (c3 = 0; c3 <= 10; c3 = c3 + 0.1) //同理
                {
                    
                    for (i = 1; i < 13; i++)
                    {
                        if (i >= 8)
                        {
                            n[i] = n[i - 1] + b11 * c0 * n[i - 8] + b21 * c3 * e[i - 8];
                            e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1]
                                - b21 * c3 * e[i - 8];
                        }
                        else
                        {
                            n[i] = n[i - 1] + b21 * c3 * E[i - 1];
                            e[i] = e[i - 1] + b11 * c0 * n[i - 1] + b21 * c3 * e[i - 1]
                                - b21 * c3 * E[i - 1];
                        }
                    }
                    for (j = 0; j < 13; j++) //使用不同的循环变量j
                    {
                        aim = sqrt((e[j] - m[j]) * (e[j] - m[j])) + aim; //使用sqrt函数计算平方根
                    }
                    
                }
            }
        }
    }
    printf("b11=%f, b21=%f, c0=%f, c3=%f\n", b11, b21, c0, c3); //打印出对应的参数值
    printf("aim=%f\n", aim); //打印出aim的值
   
    return 0;
}