我是不是在 C++ 中正确实现了欧拉方法?

Posted

技术标签:

【中文标题】我是不是在 C++ 中正确实现了欧拉方法?【英文标题】:Am I implementing Euler's Method correctly in C++?我是否在 C++ 中正确实现了欧拉方法? 【发布时间】:2021-12-11 01:15:21 【问题描述】:

我被要求写一个C或C++程序来解决the given differential equation

这必须使用欧拉方法在数值上实现。用户应该能够在程序开始时输入速度 (v)、x(0) 的初始值和最终时间 (T)。它还应该绘制时间 0

我觉得我的程序运行良好,但在方程方面正确实施欧拉方法时遇到了麻烦。这是我创建的程序。任何反馈/建议将不胜感激。如果您需要更多信息,请告诉我。

#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
using namespace std;
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#include <array>
#include "gnuplot.cxx"

int main()

    //establishing  values
    double v, x0, T, dt, number_steps;
    const int max_number_steps = 100000;
    int i=0;
    
    //establishing numverical arrays
    double value_t [max_number_steps];
    double approx_x [max_number_steps];
 
   //Allow users to input variables
    cout<<"Enter Initial Condition"<< endl;
    cout<<"Velocity(v) = ";
    cin>> v;
    cout<<"x0 = ";
    cin >> x0;
    cout<<"Final time(T) = ";
    cin >> T;   
    cout << "number steps = ";
    cin >> number_steps;
    
    //Establishing stepside and assigning arrays
    dt = T/number_steps;
    value_t[0]= 0.0;
    approx_x[0] = x0;

    //for loop which should implement Euler's Method 
    for ( i= 0; i < number_steps; i++)
    
        value_t [i+1] = dt*(i+1);
        approx_x[i+1] = approx_x[i+1] + dt*v;

    
    
    //Graph the plot via gnuplot
     gnuplot_one_function("Velocity", "linespoints", "Time(t)", "Position(x)", value_t, approx_x, number_steps);

    return 0;


【问题讨论】:

是的,需要更多信息。你的程序有什么问题吗?如果不是,这更适合codereview。如果是,请添加minimal reproducible example - 删除绘图并添加所需和获得的输出。 请不要使用不相关的语言进行标记。 没有 C/C++ 语言,它们非常不同,每个新版本更是如此。这似乎是 C++。 你有很多不必要的包含。 @Arkku • 我正在研究一种我称之为C/C++ 语言的语言。这将有助于所有提出有关 C/C++ 语言问题的人。它基于 OCaml。 【参考方案1】:

你对欧拉方法概念有一个根本性的错误。


my_aprox[i + 1]  = my_aprox[i] + dt*v

请记住,要计算新的近似值,您必须“先验”初始值,而下一个近似值将是下一个初始值。

【讨论】:

【参考方案2】:

除了与干净代码相关的问题外,这里还有一个错误:

approx_x[i+1] = approx_x[i+1] + dt*v;

Euler 方法从第 x_i 个元素计算第 x_i+1 个元素,并将微分方程的右手边乘以 step 这样:

approx_x[i+1] = approx_x[i] + dt*v;  // where approx_x[0] = x_0;

【讨论】:

以上是关于我是不是在 C++ 中正确实现了欧拉方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sql 数据库中正确实现商务数据关系?

在 Android 中正确实现 ViewPager2

如何在.Net中正确实现自定义计时器

尝试在 python 中正确实现 sum 和 clip list 操作

如何在 C++ 中正确定义包含科学记数法的整数向量?

“运行时检查失败 #0 - ESP 的值未在函数调用中正确保存”从 C++ 代码成功 C# 回调后