2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Численные методы решения дифуров
Сообщение27.09.2008, 17:56 
Меня интересует вопрос, можно ли применять численные методы, а в частности методы Эйлера и Рунге Кутта, для решения дифура n-ного порядка, если в это уравнение не входит явно независимая переменная??

 
 
 
 Re: Численные методы решения дифуров
Сообщение27.09.2008, 17:57 
Аватара пользователя
gustav писал(а):
Меня интересует вопрос, можно ли применять численные методы, а в частности методы Эйлера и Рунге Кутта, для решения дифура n-ного порядка, если в это уравнение не входит явно независимая переменная??

а Вы считайте, что это она туда таким образом входит, что не входит :lol: :lol: :lol:

 
 
 
 
Сообщение27.09.2008, 18:03 
Короче, пример: x``` + x`` + x` + x = const

 
 
 
 
Сообщение27.09.2008, 19:27 
Аватара пользователя
gustav в сообщении #146873 писал(а):
Меня интересует вопрос, можно ли применять численные методы, а в частности методы Эйлера и Рунге Кутта, для решения дифура n-ного порядка, если в это уравнение не входит явно независимая переменная?


А разве в этих методах где-нибудь требуется зависимость от независимой переменной?

gustav в сообщении #146878 писал(а):
пример: x``` + x`` + x` + x = c


А что требуется-то?

Кстати, формулы следует окружать знаками доллара:

$x``` + x`` + x` + x = c$

Опа! Штрихи не те:

$x'''+x''+x'+x=c$

Код:
$x''' + x'' + x' + x = c$

 
 
 
 
Сообщение28.09.2008, 10:12 
Someone
Спасибо за совет. Требуется решить на ЭВМ одно уравнение третьего порядка, в общем виде:
$aw```+bw``+cw`+dw=e$ (*)
где w - это функция зависящая от t,
a, b, c, d, e - константы.
Я реализовал 2 алгоритма - Эйлера и Рунге Кутта - но они дают неправильный результат (проверял на МатКаде).
У меня есть реализация метода Рунге Кутта для уравнения, содержащего явно независимую переменную, так вот эта реализация дает правильные результаты, алгоритм тот же.
Вот и думаю, почему уравнение (*) не удается решить с помощью этого алгоритма.[/math]

 
 
 
 
Сообщение28.09.2008, 10:20 
gustav писал(а):
Someone
Спасибо за совет. Требуется решить на ЭВМ одно уравнение третьего порядка, в общем виде:
$aw```+bw``+cw`+dw=e$ (*)
где w - это функция зависящая от t,
a, b, c, d, e - константы.
Я реализовал 2 алгоритма - Эйлера и Рунге Кутта - но они дают неправильный результат

Сказать ничего невозможно. Изложите свои алгоритмы (в смысле рабочие формулы).

 
 
 
 
Сообщение28.09.2008, 10:57 
Аватара пользователя
gustav в сообщении #147042 писал(а):
Я реализовал 2 алгоритма - Эйлера и Рунге Кутта - но они дают неправильный результат (проверял на МатКаде).

А как, интересно, Вы проверяли на маткаде? Вы думаете, он какие методы использует?

 
 
 
 
Сообщение28.09.2008, 18:55 
ewert
Вот код, реализующий метод Эйлера на С++:

// Consatnts
const int N = 10;
const double E = 10;
const double Tya = 0.5;
const double Tem = 1;
const double Tv = 3;
const double kdv = 0.5;
const double ktp = 50;
// ~Consatnts

struct vector {
double w, y, z;
};

int main(int argc, char* argv[])
{
double ind;
double h, T;
vector v, v0;

for (ind = 0+h; ind <= T; ind += h) {
v = CalcCondition(v0);
v0 = v;
cout << "\n" << ind << ": " << v.w;
}
}

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;
}

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;
}
Все понятно?

Добавлено спустя 2 минуты 50 секунд:

Парджеттер
В маткаде я решал уравнение 3-его порядка, строил график полученной функции и сравнивал полученные в своей проге результаты с графиком

 
 
 
 
Сообщение28.09.2008, 19:33 
Честно? Ни фига не понятно, тем более что я в сях не секу.
Вот я Вам сейчас отомщу -- напишу на нормальном, человеческом Паскале, как надо было:

Код:
type float = extended;
type pointtype = array[0.. 2] of float;
type coeftype = record   a,b,c,d: float;   end;

{--------------------------------------------------------------------------------------------}
function right(u: pointtype; k: coeftype): float;
begin
  right:=(k.e-u[0]*k.d-u[1]*k.c-u[2]*k.b)/k.a;
end;
{--------------------------------------------------------------------------------------------}
procedure euler_one_step(uold: pointtype; k: coeftype; h: float; var unew: pointtype);
begin
  unew[0]:=uold[0] + uold[1]*h;
  unew[1]:=uold[1] + uold[2]*h;
  unew[2]:=uold[2] + right(uold, k)*h;
end;
{--------------------------------------------------------------------------------------------}

Ну и потом, естественно, надо зациклить процедуру euler_one_step, накапливая очередные значения u[0] в каком-нить массиве (или просто делая с ними, что душеньке угодно).

Это -- конкретно для Эйлера. Для Рунге-Кутта вообще -- аналогично, только соотв. длиннее.

 
 
 
 
Сообщение29.09.2008, 15:01 
ewert
Этот код действительно работает? Он проверен на примерах?

 
 
 
 
Сообщение29.09.2008, 15:20 
Конкретно этот -- нет. Он только что на коленке натыкан. Но -- куда он денется?

Я ж просил -- выдайте формулы, по которым Вы считаете. Скорее всего, именно в них что-то не так.

-----------------------------------------------------------------------
Да, кстати, а процедуру реализации одного шага (учитывая, что она предназначена именно для пересчёта старых значений) разумнее было бы переписать так:

Код:
{--------------------------------------------------------------------------------}
procedure euler_one_step(var u: pointtype; k: coeftype; h: float);
var  uold: pointtype;
begin
  uold:=u;
  u[0]:=u[0] + u[1]*h;
  u[1]:=u[1] + u[2]*h;
  u[2]:=u[2] + right(uold, k)*h;
end;
{--------------------------------------------------------------------------------}

 
 
 
 
Сообщение29.09.2008, 16:27 
Не, формулы такие же как и в Вашем коде, я его на Си переписал - ни фига. А может существуют какие то условия, при которых метод Эйлера не сходится? И мое уравнение подходит под эти условия?

Добавлено спустя 30 минут 34 секунды:

Блиииин, вот это да!! Короче, алгоритм, оказывается нормальный! Просто я ж решал уравнение 3-его порядка, сводил его к системе из 3-х ур-ий 1-ого порядка и решал с помощью алгоритма. А в МатКаде я решал сразу уравнение 3-его порядка без предварительного сведения к системе. При этом у меня получались ощутимо разные результаты. А сейчас я решил в Маткаде именно систему уравнений и результат сошелся!!!!! Не знаю, почему так, но решение системы наконец-то получилось! Спасибо всем за советы!!!

 
 
 
 
Сообщение29.09.2008, 16:37 
Тогда исчо версия (совсем уж тупая): возможно, Ваше решение отклоняется от официального всего лишь на погрешность метода. Коя существует, и никак не может не существовать.

А больше мне уж и фантазии не хватает.

Добавлено спустя 4 минуты 35 секунд:

gustav писал(а):
А сейчас я решил в Маткаде именно систему уравнений и результат сошелся!!!!! Не знаю, почему так, но

но это напрасно. Отчёт в своих действиях (пусть самому себе) желательно всё же отдавать.

 
 
 
 
Сообщение29.09.2008, 16:40 
ewert
Не, ну вообще-то дифур 3-его порядка и эквивалентная ему система должны ж по идее одни и те же результаты давать? Или я ошибаюсь?

 
 
 
 
Сообщение29.09.2008, 18:00 
да должны, должны. В пределах точности приближённого метода, разумееется. Вы вот так, хоть навскидку -- прикидывали, насколько Ваш алгоритм даёт разумное приближение к точному решению известных уравнений?

-- а ведь это -- само собой разумеющийся тест на правильность алгортма.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group