计算方法/数值分析牛顿下山法C/C++实现方法

博主分享了一次因盲目跟随错误流程图导致的编程困境,通过自我反思和问题排查,最终发现并修正了流程图中的错误,强调了独立思考和流程图分析的重要性。

一、前言(吐槽)

我真的不知道该说些什么好,其实也怪自己。老师将实验发下来,然后我就跟这着老师的实验任务做,实验word上用的什么流程图我就用那个流程图,然而我根据老师的流程图遍完了程序,怎么验算结果都不对,就开始找自己的问题,根本没去想流程图,后来才发现,是自己太年轻了,老师给的流程图错了,其实都怨自己,一味的去抄这个流程图,没有去分析这个流程图,这次狠狠的给我上了一课,浪费了好多时间。

image.png

二、算法流程图

具体流程图哪里错了,我就不告诉大家了,下面是错误的流程图,大家自己分析一下吧。挺简单的错误。
image.png

三、代码

#include <iostream>
using namespace std;
int main(){
    bool flag = false;//用来判断是第几层循环
    double X0,X1,r;
    cout<<"请输入初值:"<<endl;
    cin>>X0;
    double e;
    cout<<"请输入误差限:"<<endl;
    cin>>e;
    int m;
    cout<<"请输入下山最大次数:"<<endl;
    cin>>m;
    int n;
    cout<<"请输入迭代最大次数:"<<endl;
    cin>>n;
    int k=0;
    int i=0;

    while(true)
    {
        //说明下山成功进行迭代
        if(r !=1)
        {
            cout<<"第"<<i<<"步下山因子:"<<r<<endl;
        }
        r = 1.0;
        if(3*X0*X0-1 != 0)
        {

            while (true)
            {
                if(flag)
                {
                    flag = false;
                    break;
                }
                X1 = X0 - r*(X0*X0*X0 - X0 - 1) / (3.0 * X0*X0 - 1);
                if(abs(X1*X1*X1 - X1 - 1) > abs(X0*X0*X0 - X0 - 1))
                {
                    cout<<"第"<<i<<"步下山因子:"<<r<<endl;
                    cout<<"--------------"<<endl;

                    i=i+1;
                    r=r*0.5;
                    if(i>=m)
                    {
                        cout<<"重新输入x0"<<endl;
                        return 0;
                    }
                    else
                        continue;

                }
                else
                {
                    if (abs(X1 - X0) <e)
                    {

                        cout<<"近似根为:"<<X1<<endl;
                        return 0;
                    }
                    else
                    {
                        k=k+1;
                        X0=X1;
                        if(k>=n)
                        {
                            cout<<"迭代失败!"<<endl;
                            return 0;
                        }
                        else
                        {
                            flag = true;
                            continue;
                        }
                    }
                }
            }
        } else
        {
            cout<<"奇异标志"<<endl;
            return 0;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值