将逻辑从向量 <float> 更改为仅浮点数 - Euler

Change logic from vector <float> to only float - Euler

提问人:Borys Ostapienko 提问时间:10/24/2023 更新时间:10/24/2023 访问量:58

问:

我有一个用于估计函数的欧拉公式的实现。类型是数组,格式是向量,但由于后面的代码,传递的参数需要是普通的浮点数。想知道如何在这里重构代码。DYDT采用现有公式

void euler(float y0, float a, int n, float dt, std::vector<float>& t, std::vector<float>& y) {
double y_init = y0;
double t_init = 0.0;

for (int i = 0; i <= n; i++) {

   t.push_back(t_init);
   y.push_back(y_init);



double y_p = dydt(y_init, a);

   y_init = y_init + dt * y_p;

   t_init = t_init + dt;


    }

}

但是,它需要是某种类型:

void euler(float y0, float a, int n, float dt, float t[n], float y[n])

我目前被困在带有常规数组的 for 循环中的逻辑上。在这种情况下,向量更有意义,但由于后面使用的函数,t 和 y 需要是规则浮点数。

C++ 数组指 数学 欧拉

评论

0赞 463035818_is_not_an_ai 10/24/2023
什么是“后期代码”?为什么需要 c 阵列而不是向量?
3赞 user12002570 10/24/2023
@OP 首先要做的事情(仅供参考)(在参数中表示float t[n]float *t

答:

2赞 Sam Varshavchik 10/24/2023 #1

如您所知,其中一件事就是跟踪向量中有多少个值。这是a为您做的事情之一。这是深藏不露的秘密之一,但它会很乐意向你透露它,只需通过称呼它的优点来询问。 自动为您递增它,其他矢量操作也会相应地更新它。std::vectorstd::vectorstd::vectorsize()push_back()

通过摆脱向量并切换到普通数组,这成为您的工作

您需要声明两个变量并将它们初始化为零。也许称他们为人

size_t t_size=0, y_size=0;

每个向量对应一个以前的向量。然后只需将所有向量用数组替换,并相应地实现向量等效逻辑。就是这样。任务完成。收工。例如:

t.push_back(t_init);

现在变成:

t[t_size++]=t_init;

等等。

根据实际细节,这足以声明和初始化此函数中的大小值,或者通过引用将它们作为附加参数传入已初始化的值。目前尚不清楚情况是否如此,但这是您应该能够自己弄清楚的事情。

P.S. 您还需要弄清楚的一件事是为什么您的程序会出现神秘的崩溃。这是因为

for (int i = 0; i <= n; i++)

将迭代时间,而不是时间,并生成值(你可以选择这里,然后看看纸和铅笔会发生什么)。将值放入只有值的数组中总是以眼泪告终。n+1nn+1n1n+1n

评论

0赞 Borys Ostapienko 10/24/2023
谢谢你的解释!你已经设法在不到一个段落中解释了数组逻辑的关键概念......我的老师在几个星期的讲座中未能解释的事情。再次感谢!
0赞 Sam Varshavchik 10/24/2023
别客气。只是把这个评论留给这里的其他人,他们一直在骂我对新来者居高临下和粗鲁。
0赞 Pete Becker 10/24/2023
不错的答案。+1.