簡體   English   中英

Runge Kutta C#中的錯誤返回值

[英]Wrong return value in Runge Kutta C#

有人可以告訴我,為什么它總是返回相同的“ y”值? 我在互聯網上進行了很多搜索,但我仍然不知道為什么它不起作用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inżynierkuuuu
{
class Lecimy
{
    double t, y, krok, cel;

    public Lecimy(double t, double y, double krok, double cel)
    {
        this.t = t;
        this.y = y;
        this.krok = krok;
        this.cel = cel;
    }

    public delegate double funkcja(double t, double y);

    public double RK(double t, double y, double krok, funkcja yp)
    {
        double k1 = krok * yp(t, y);
        double k2 = krok * yp(t + krok * 0.5, y + k1 * 0.5);
        double k3 = krok * yp(t + krok * 0.5, y + k2 * 0.5);
        double k4 = krok * yp(t + krok, y + k3);

        double reszta = 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

        this.y = y + reszta;

        return y;
    }

    public void Run()
    {
        while(t < cel)
        {
            y = RK(t, y, krok, FN1);
            t = t + krok;
            Console.WriteLine("t: {0}, y: {1}", t, y);
        }
    }

    public double FN1(double t, double y)
    {
        return y;
    }

}
}

第二類:這里的“ y”值為1,當我將其更改為5時,它將始終在“輸出”窗口中返回5。

static void Main(string[] args)
    {
        Lecimy e = new Lecimy(0.0, 1.0, 0.0001, 1.0); 
        e.Run();
        //Application.EnableVisualStyles();
        //Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new Form1());
    }

我不知道您想做什么,但是我確定以下行不是您想要的:

double reszta = 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

reszta將始終為零。 1 / 60 ,因為1和6均為整數。 使用1.0 / 6或類似的值。

即使我不理解您要執行的操作,您的代碼也有兩個明顯的問題。

  1. 1/6將始終為零,您應該執行1.0/6 原因是在前者中,選擇了/(int, int)重載。
  2. 您正在將參數y與類字段y混淆。 命名一個局部變量/參數/使用相同的名稱,它的混亂,很容易出錯的領域; 在方法RK ,您確定不應該返回this.y嗎? 您確定this.y = y + reszta是正確的,而不應該是this.y += reszta 看到這是多么令人困惑?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM