2014 dxdy logo

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

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


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему
 
 Численные методы решения дифуров
Сообщение27.09.2008, 17:56 


15/09/08
10
Меня интересует вопрос, можно ли применять численные методы, а в частности методы Эйлера и Рунге Кутта, для решения дифура n-ного порядка, если в это уравнение не входит явно независимая переменная??

 Профиль  
                  
 
 Re: Численные методы решения дифуров
Сообщение27.09.2008, 17:57 
Аватара пользователя


02/04/08
742
gustav писал(а):
Меня интересует вопрос, можно ли применять численные методы, а в частности методы Эйлера и Рунге Кутта, для решения дифура n-ного порядка, если в это уравнение не входит явно независимая переменная??

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

 Профиль  
                  
 
 
Сообщение27.09.2008, 18:03 


15/09/08
10
Короче, пример: x``` + x`` + x` + x = const

 Профиль  
                  
 
 
Сообщение27.09.2008, 19:27 
Заслуженный участник
Аватара пользователя


23/07/05
18010
Москва
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 


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

 Профиль  
                  
 
 
Сообщение28.09.2008, 10:20 
Заслуженный участник


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

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

 Профиль  
                  
 
 
Сообщение28.09.2008, 10:57 
Экс-модератор
Аватара пользователя


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

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

 Профиль  
                  
 
 
Сообщение28.09.2008, 18:55 


15/09/08
10
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 
Заслуженный участник


11/05/08
32166
Честно? Ни фига не понятно, тем более что я в сях не секу.
Вот я Вам сейчас отомщу -- напишу на нормальном, человеческом Паскале, как надо было:

Код:
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 


15/09/08
10
ewert
Этот код действительно работает? Он проверен на примерах?

 Профиль  
                  
 
 
Сообщение29.09.2008, 15:20 
Заслуженный участник


11/05/08
32166
Конкретно этот -- нет. Он только что на коленке натыкан. Но -- куда он денется?

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

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

Код:
{--------------------------------------------------------------------------------}
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 


15/09/08
10
Не, формулы такие же как и в Вашем коде, я его на Си переписал - ни фига. А может существуют какие то условия, при которых метод Эйлера не сходится? И мое уравнение подходит под эти условия?

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

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

 Профиль  
                  
 
 
Сообщение29.09.2008, 16:37 
Заслуженный участник


11/05/08
32166
Тогда исчо версия (совсем уж тупая): возможно, Ваше решение отклоняется от официального всего лишь на погрешность метода. Коя существует, и никак не может не существовать.

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

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

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

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

 Профиль  
                  
 
 
Сообщение29.09.2008, 16:40 


15/09/08
10
ewert
Не, ну вообще-то дифур 3-его порядка и эквивалентная ему система должны ж по идее одни и те же результаты давать? Или я ошибаюсь?

 Профиль  
                  
 
 
Сообщение29.09.2008, 18:00 
Заслуженный участник


11/05/08
32166
да должны, должны. В пределах точности приближённого метода, разумееется. Вы вот так, хоть навскидку -- прикидывали, насколько Ваш алгоритм даёт разумное приближение к точному решению известных уравнений?

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group