如何通过 Runge-Kutta 4 传递硬编码微分方程

2023-11-26

我正在尝试实施 Runge-Kutta 来解决示例问题 C# 中的 dy/dt = y - t^2 + 1 和 dy/dt = t * y + t^3 ,我似乎无法获得我期望的输出。我已将我的程序分成几个类,以尝试单独查看工作。我认为我的主要错误来自尝试使用委托将方法作为变量通过 Runge-Kutta 进程传递。

方程类:

namespace RK4
{
    public class Eqn
    {
        double t;
        double y;
        double dt;
        double b;
        public Eqn(double t, double y, double dt, double b)
        {
            this.t = t;
            this.y = y;
            this.dt = dt;
            this.b = b;
        }
        public void Run1()
        {
            double temp;
            int step = 1;
            RK4 n = new RK4();
            while (t < b)
                    {
                        temp = n.Runge(t, y, dt, FN1);
                        y = temp;
                        Console.WriteLine("At step number {0}, t: {1}, y: {2}", step, t, y);
                        t = t + dt;
                        step++;
                    }
        }
        public void Run2()
        {
            int step = 1;
            RK4 m = new RK4();
            while (t < b)
            {
                y = m.Runge(t, y, dt, FN2);
                Console.WriteLine("At step number {0}, t: {1}, y: {2}", step, t, y);
                t = t + dt;
                step++;
            }
        }
        public static double FN1(double t, double y)
        {
            double x = y - Math.Pow(t, 2) + 1;
            return x;
        }
        public static double FN2(double t, double y)
        {
            double x = t * y + Math.Pow(t, 3);
            return x;
        }
    }
}

然后是龙格-库塔 4 级:

    namespace RK4
    {
        class RK4
        {
            public delegate double Calc(double t, double y);
            public double Runge(double t, double y, double dt, Calc yp)
            {
                double k1 = dt * yp(t, y);
                double k2 = dt * yp(t + 0.5 * dt, y + k1 * 0.5 * dt);
                double k3 = dt * yp(t + 0.5 * dt, y + k2 * 0.5 * dt);
                double k4 = dt * yp(t + dt, y + k3 * dt);
                return (y + (1 / 6) * (k1 + 2 * k2 + 2 * k3 + k4));
            }
        }
    }

And my Program Class:

namespace RK4
{
    class Program
    {
            static void Main(string[] args)
        {
            RunProgram();
        }
        public static void RunProgram()
        {
            Console.WriteLine("*******************************************************************************");
            Console.WriteLine("************************** Fourth Order Runge-Kutta ***************************");
            Console.WriteLine("*******************************************************************************");
            Console.WriteLine("\nWould you like to implement the fourth-order Runge-Kutta on:");
            string Fn1 = "y' = y - t^2 + 1";
            string Fn2 = "y' = t * y + t^3";
            Console.WriteLine("1) {0}", Fn1);
            Console.WriteLine("2) {0}", Fn2);
            Console.WriteLine("Please enter 1 or 2");
            switch (Int32.Parse(Console.ReadLine()))
            {
                case 1:
                    Console.WriteLine("\nPlease enter beginning of the interval (a):");
                    double a = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter end of the interval (b):");
                    double b = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter the step size (h) to be used:");
                    double h = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter the inital conditions to satisfy y({0}) = d",a);
                    Console.WriteLine("d = ");
                    double d = Double.Parse(Console.ReadLine());
                    Console.Clear();
                    Console.WriteLine("Using the interval [{0},{1}] and step size of {2} and the inital condition of y({3}) = {4}:", a, b, h, a, d);
                    Console.WriteLine("With equation: {0}", Fn1);
                    Eqn One = new Eqn(a, d, h, b);
                    One.Run1();
                    Console.WriteLine("Press enter to exit.");
                    Console.ReadLine();
                    Environment.Exit(1);
                    break;
                case 2:
                    Console.WriteLine("\nPlease enter beginning of the interval (a):");
                    a = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter end of the interval (b):");
                    b = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter the step size (h) to be used:");
                    h = Double.Parse(Console.ReadLine());
                    Console.WriteLine("Please enter the inital conditions to satisfy y({0}) = d",a);
                    Console.WriteLine("d = ");
                    d = Double.Parse(Console.ReadLine());
                    Console.Clear();
                    Console.WriteLine("Using the interval [{0},{1}] and step size of {2} and the inital condition of y({3}) = {4}:", a, b, h, a, d);
                    Console.WriteLine("With equation: {0}", Fn1);
                    Eqn Two = new Eqn(a, d, h, b);
                    Two.Run2();
                    Console.WriteLine("Press enter to exit.");
                    Console.ReadLine();
                    Environment.Exit(1);
                    break;
                default:
                    Console.WriteLine("Improper input, please press enter to exit.");
                    Console.ReadLine();
                    Environment.Exit(1);
                    break;
            }
        }
    }
}

无论如何,这都不是优雅的编程,但我没有足够的知识来知道我现在做错了什么。从我读到的内容来看,我认为 RK4 类中的代表能够通过我的硬编码 diff eq。


您在 RK4 实现中犯了一个经典错误:有两个变体来定位乘法dt要从中选择,您正在使用两者。

它是

k2 = dt*f(t+0.5*dt, y+0.5*k1)

or

k2 = f(t+0.5*dt, y+0.5*dt*k1)

算法的其他行也类似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 Runge-Kutta 4 传递硬编码微分方程 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 私有模板函数

    我有一堂课 C h class C private template
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • Django 自定义保存模型

    我正在尝试在 django 的保存模型中执行基本日期计算 请参见下面的代码 class Purchase models Model purchase date models DateField purchase place models C
  • Java自定义注解和动态加载

    我正在尝试开发用于数据库同步的 ORM 并决定尝试一下 Java 反射 我有一个像这样定义同步注释的库 Retention RetentionPolicy RUNTIME Target ElementType TYPE Inherited
  • 如何将 webfont 与 @font-face 一起使用

    我想将应用程序中的字体更改为自定义字体 但以下代码不起作用 font face font family ArnoProBold src url resources fonts ArnoProBold ttf font face font f
  • 为什么我的 ASP.Net 静态函数的“上下文”在用户会话之间交叉?

    我想我需要一些帮助来理解静态对象如何在 ASP Net 应用程序中持久存在 我有这样的场景 类库中的 someFile cs public delegate void CustomFunction public static class A
  • JFreeChart - XYBarChart 显示每个系列的单独条形图

    我正在使用 JFreeChart 创建 XYBarChart 并向其中添加多个系列 目前 对于该系列中给定的 x 值和不同的 Y 值 所有这些值都相互堆叠在一起 对于给定的 x 值 是否可以将每个系列显示为不同的条形 Edit 我发布了用于
  • 使用 VBA 宏搜索 Excel 行中字符串的精确匹配

    如何在 Excel 的某一特定行中搜索字符串 我有一个长类型变量的行索引 Dim rowIndex As Long rowIndex some value being set here using some code 现在我需要检查该行中是
  • 使用 gnuplot 在轴上显示 2 的幂

    我正在尝试使用 gnuplot 绘制实验结果 我编写了一个 C 程序 它生成一个如下所示的数据文件 10 3 5 11 3 5 12 3 5 13 3 6 我想做的是将这个数据文件第一列的值在 x 轴上显示为 2 的幂 它看起来像这样 它不
  • Airflow 上具有 DataprocOperator 的组件网关

    在 GCP 中 安装和运行非常简单JupyterHub 组件通过 UI 或 gcloud 命令 我正在尝试通过 Airflow 和DataprocClusterCreateOperator 这里是 DAG 的摘录 from airflow
  • 使用 git clone --mirror 和 git push --mirror 移动 git repo

    我必须将几个存储库从 Gitlab 移至 Bitbucket 并发现最简单的方法似乎是 在 Bitbucket 中创建新的空存储库 git clone mirror email protected path to repo git cd r
  • 如何使用正则表达式用方法结果替换匹配组项

    输入字符串是这样的 A线 50 线路N 120 A线 12 B线 53 我想用以下结果替换 LineB 值MultiplyCalculatorMethod LineAValue where LineAValue是上面一行的值LineB an
  • 将 HTML 输入数字上的向下箭头变得更大、更清晰

    而不是输入 数字 时是否可以始终显示向上 向下箭头 我希望能够使向上 向下箭头更大更清晰 What I have right now I need to make them bigger like this 您可以将输入包装在元素中并设置其
  • 错误:请提供起始值

    我正在 R 中进行对数二项式回归 我想控制模型中的协变量 年龄和 BMI 都是连续变量 而因变量是结果 是或否 自变量是组 1 或 2 fit lt glm Outcome Group data data 1 family binomial
  • 如何将焦点设置为 JScrollPane 内 JTable 中的第一行

    我有一个JTable里面一个JScrollPane 我已将其放入面板中 面板加载后 我希望 JTable 中的第一行获得焦点 但默认情况下焦点会转到JScrollPane按下 Tab 键 焦点进入表格第一行 我不想使用setRowSelec
  • ThreeJS 阴影未渲染

    我浏览过其他一些 S O 问题 遵循了所有建议 但我仍然不知道为什么我无法在这个非常基本的场景上渲染阴影 http jsfiddle net 4Txgp 更新 代码 var SCREEN WIDTH window innerWidth 25
  • 下载闪亮的 rpivotTable 输出

    我发现了一个有趣的包rpivotTable 我想创建shiny app包括rpivotTable可以使用下载生成的数据downloadHandler 但是 我无法找到解决方案 如何创建data frame或者我可以传递给的其他东西downl
  • 如何使这个 eav 查询产生水平结果

    案子 tables product product id name 1 iphone 4 2 gallaxy 2 3 blackbery 6 product attribute id product id attribute id 1 1
  • 如何使用 JAXB 解组重复的嵌套类?

    我如何指示 JAXB 处理这个问题 XML
  • Python向dbf写入数据时出错

    我得到这个错误 DbfError unable to modify fields individually except in with or Process 如何修复它 这是我的code with dbf Table aa dbf as
  • 从网页向 chrome 扩展程序发送消息

    我想从随机网页的控制台发送消息到我的 chrome 扩展程序 chrome extension sendMessage 似乎不起作用 根据官方文档你应该使用postMessage在发送者和message接收器中的事件监听器 这是一个例子 您
  • 如何通过 Runge-Kutta 4 传递硬编码微分方程

    我正在尝试实施 Runge Kutta 来解决示例问题 C 中的 dy dt y t 2 1 和 dy dt t y t 3 我似乎无法获得我期望的输出 我已将我的程序分成几个类 以尝试单独查看工作 我认为我的主要错误来自尝试使用委托将方法