Показать полную графическую версию : Решение дифуравнения на С++
gustav21
21-09-2008, 18:48
Подскажите, пожалуйста, алгоритм решения дифура 3-его порядка методом Эйлера. Там вроде как надо переходить от дифура к системе дифуров 1-ого порядка...
gustav21, нужно просто посчитать или поставить вопрос решений на поток и изготовить для этого прогу?
В любом случаи существуют готовые математические программы среди которых Maple, MathCAD, Matlab, Mathematica и т.д.
Как примерно это выглядит
Решение дифференциальных уравнений в Mathcad (http://www.exponenta.ru/soft/Mathcad/UsersGuide/chapter16/16_1.asp)
Аналитическое решение дифференциальных уравнений с помошью Maple (http://www.exponenta.ru/educat/systemat/savotchenko/6_1.asp)
и т.д. на том же ресурсе.
А насчёт самого хода решения то в данном случаи с 3го можем понизить (если оно не содержит y или x) до 2го и решать его.
-><-
Нормальная форма дифференциального уравнения (http://www.exponenta.ru/educat/class/test/showitem/?item=92)
Решение обыкновенного дифференциального уравнения (http://www.exponenta.ru/educat/class/test/showitem/?item=496)
Общее решение обыконовенного дифференциального уравнения (http://www.exponenta.ru/educat/class/test/showitem/?item=497)
Дифференциальное уравнение вторго порядка (http://www.exponenta.ru/educat/class/test/showitem/?item=102)
Дифференциальное уравнение n-го порядка (http://www.exponenta.ru/educat/class/test/showitem/?item=103)
-><-
gustav21
22-09-2008, 09:19
В том то и дело, что нужна именно прога на С++ (ну или алгоритм накрайняк)
ну или алгоритм накрайняк »т.е., что такое метод Эйлера ты не знаешь?
gustav21
22-09-2008, 20:41
Знаю, я сделал прогу, но она дает неправильные результаты, я проверял в Маткаде, может я не так реализовал этот алгоритм.... могу привести код вот он:
главный цикл
for (ind = 0+h; ind <= T; ind += h) {
v = CalcCondition(v0);
v0 = v;
cout << "\n" << ind << ": " << v.w;
}
h - это шаг
описание структур v и v0:
struct vector {
double w, y, z;
} v, v0;
vector CalcCondition (vector v0) {
vector v;
v.z = f1(v0.w, v0.y, v0.z);
v.y = f2(v0.w, v0.y, v.z);
v.w = f3(v0.w, v.y, v.z);
return v;
}
double f1 (double w, double y, double z) {
return z + (-z/Tya - (Tv+Tem)*y/(Tya*Tv*Tem) - w/(Tya*Tv*Tem) + kdv*u/(Tya*Tv*Tem))*h;
}
double f2 (double w, double y, double z) {
return y + z*h;
}
double f3 (double w, double y, double z) {
return w + y*h;
}
функции f1, f2, f3 - это система дифуров первого порядка, вот система:
z(штрих) = -z/Tya - (Tv+Tem)*y/(Tya*Tv*Tem) - w/(Tya*Tv*Tem) + kdv*u/(Tya*Tv*Tem)
y(штрих) = z
w(штрих) = y
T, к - это все константы
вроде все правильно написано, но результаты неправильные!!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.