提问人:Borys Ostapienko 提问时间:10/24/2023 更新时间:10/24/2023 访问量:58
将逻辑从向量 <float> 更改为仅浮点数 - Euler
Change logic from vector <float> to only float - Euler
问:
我有一个用于估计函数的欧拉公式的实现。类型是数组,格式是向量,但由于后面的代码,传递的参数需要是普通的浮点数。想知道如何在这里重构代码。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 需要是规则浮点数。
答:
2赞
Sam Varshavchik
10/24/2023
#1
如您所知,其中一件事就是跟踪向量中有多少个值。这是a为您做的事情之一。这是深藏不露的秘密之一,但它会很乐意向你透露它,只需通过称呼它的优点来询问。 自动为您递增它,其他矢量操作也会相应地更新它。std::vector
std::vector
std::vector
size()
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+1
n
n+1
n
1
n+1
n
评论
0赞
Borys Ostapienko
10/24/2023
谢谢你的解释!你已经设法在不到一个段落中解释了数组逻辑的关键概念......我的老师在几个星期的讲座中未能解释的事情。再次感谢!
0赞
Sam Varshavchik
10/24/2023
别客气。只是把这个评论留给这里的其他人,他们一直在骂我对新来者居高临下和粗鲁。
0赞
Pete Becker
10/24/2023
不错的答案。+1.
评论
float t[n]
float *t