plot — Интегрирование Эйлера с использованием Polyline (), переполнение стека

Итак, я пытаюсь построить вывод этой функции интеграции Эйлера:

typedef double F(double,double);
using std::vector;

void euler(F f, double y0, double a, double b, double h,vector<POINT> Points)
{

POINT Pt;
double y_n = y0;
double t = a;
for (double t = a; t != b; t += h )

{
y_n += h * f(t, y_n);

Pt.x = t; // assign the x value of the point to t.
Pt.y = y_n; // assign the y value of the point to y_n.
Points.push_back(Pt);

}}// Example: Newton's cooling law
double newtonCoolingLaw(double, double t)
{
return t; // return statement ends the function; here, it gives the time derivative y' = -0.07 * (t - 20)
}

Я пытаюсь использовать функцию Polyline () в приложении Win32, поэтому я делаю это под случай WM_PAINT:

case WM_PAINT:
{

hdc = BeginPaint(hWnd, &ps);

//Draw lines to screen.

hPen = CreatePen(PS_SOLID, 1, RGB(255, 25, 5));
SelectObject(hdc, hPen);using std::vector;
vector<POINT> Points(0);

euler(newtonCoolingLaw, 1, 0, 20, 1,Points);

POINT tmp = Points.at(0);
const POINT* elementPoints[1] = { &tmp };

int numberpoints = (int) Points.size() - 1 ;Polyline(hdc,elementPoints[1],numberpoints);

Когда я перенаправлю свой ввод / вывод на консоль, вот выходные данные для переменных:

введите описание изображения здесь

Я могу нарисовать ожидаемые линии на экране, используя MovetoEx(hdc,0,0,NULL) а также LineTo(hdc,20,20), но по какой-то причине ни одна из этих функций не будет работать с моим vector<POINT> Points, Какие-либо предложения?

0

Решение

Есть несколько вещей, которые кажутся мне ошибочными:

1) Вы должны передать вектор по ссылке или в качестве возвращаемого значения:

void euler(/*...*/,vector<POINT>& Points)

В настоящее время вы только передаете копию в функцию, поэтому исходный вектор не будет изменен.

2) Не сравнивайте двойные значения для (не) равенства в заголовке цикла for. Двойные значения имеют ограниченную точность, поэтому, если b намного больше h, ваш цикл может никогда не завершиться, так как t может никогда не совпадать точно с b. Сравните вместо этого «меньше»:

for (double t = a; t < b; t += h )

3) Почему вы объявляете elementPoints как массив указателей размера 1? Разве простой указатель не сделал бы:

const POINT* elementPoints =  &tmp ; //EDIT: see point 5)

4) У вас есть ошибка «один на один» при звонке Polyline, Если вы хотите придерживаться массива вообще используйте.

Polyline(hdc,elementPoints[0],numberpoints);

РЕДАКТИРОВАТЬ: Извините, я забыл важный:

5) В вашем коде elementPoints[0] указывает на один double (tmp), а не в массив внутри вектора. Это, вероятно, будет работать, если вы объявили tmpв качестве ссылки:

POINT& tmp = Points.at(0); //I'm wondering why this doesn't throw an exception, as the vector should actually be empty here

Тем не менее, я думаю, что вы действительно хотите сделать, это избавиться от tmp а также elementPoints в общем и напишите в последней строке:

Polyline(hdc,&Points[0],(int) Points.size()-1);
//Or probably rather:
Polyline(hdc,&Points[0],(int) Points.size());

Кстати: какова цель -1?

2

Другие решения


По вопросам рекламы [email protected]