Решение уравнений!

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

Misterry
Пользователь
Сообщения: 4
Зарегистрирован: Вс май 01, 2011 3:25 pm

Решение уравнений!

Сообщение Misterry » Вс май 01, 2011 3:34 pm

Здравствуйте!

Помогите, пожалуйста, разобраться с MatLab'ом

Вроде накачал книжек, но чет не понятно ничего.

Такой вопрос.
Решаю сначала одно уравнение методом Рунге-Кутта (это я разобрался как делать), из него я получаю одномерную матрицу значений, допустим y(x), в заданном диапазоне.
Допустим:
dy/dx=y+x


Далее мне надо решить другое уравнение, таким же методом и найти значение функции s(x). Но в этом уравнении присутствует неизвестная y(x), которая была вычислена в предыдущем уравнении...
Допустим:
ds/dx=s+y+x

Кому не сложно - напишите, пожалуйста, какой-нибудь простенький пример кода для второго уравнения или порекомендуйте, что почитать.

Заранее спасибо!

mlslkfpu
Пользователь
Сообщения: 353
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Решение уравнений!

Сообщение mlslkfpu » Вс май 01, 2011 4:47 pm

Решайте сразу систему двух уравнений

Misterry
Пользователь
Сообщения: 4
Зарегистрирован: Вс май 01, 2011 3:25 pm

Re: Решение уравнений!

Сообщение Misterry » Вс май 01, 2011 4:49 pm

Спасибо, за ответ!
Можно и так, но мне бы хотелось все равно узнать и научиться, как имея матрицу решений, подставить её для вычисления уравнений. В дальнейшем мне это очень пригодиться...
Очень надеюсь на ваш ответ...

mlslkfpu
Пользователь
Сообщения: 353
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Решение уравнений!

Сообщение mlslkfpu » Вс май 01, 2011 5:02 pm

Тогда можно использовать интерполяцию y(x)
doc interp1

Misterry
Пользователь
Сообщения: 4
Зарегистрирован: Вс май 01, 2011 3:25 pm

Re: Решение уравнений!

Сообщение Misterry » Вс май 01, 2011 5:23 pm

Благодарю за помощь, но я мало в чем разобрался (а ещё программистом называюсь).
Можете подсказать на конкретном примере?

Вот тут, я описываю функцию

Код: Выделить всё

function dfidr = F( r,fi )
dfidr(1)=cos(fi(1)+pi/3)*(sqrt(3)*cos(fi(1))+8*sin(fi(1)))/(r*((cos(fi(1)))^2+8*(sin(fi(1)))^2));
end

Тут выполняю решение

Код: Выделить всё

[r fi]=ode45(@F,[1 300],[pi/2]);


В итоге я получаю два вектора r и fi.


Теперь допустим есть

Код: Выделить всё

function dsdr = SS( r,s )
dsdr(1)= s*fi/r
end

Код: Выделить всё

[r s]=ode45(@SS,[300 1],[pi]);


На такую запись он будет ругаться, как объявить и задать fi и использовать его во втором уравнении, причем во втором уравнении диапазон не от 1 до 300, а наоборот.

mlslkfpu
Пользователь
Сообщения: 353
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Решение уравнений!

Сообщение mlslkfpu » Пн май 02, 2011 12:06 am

Примерно так. Код не очень, но должен работать

Ваша функция

Код: Выделить всё

function dfidr = F( r,fi )
dfidr(1)=cos(fi(1)+pi/3)*(sqrt(3)*cos(fi(1))+8*sin(fi(1)))/(r*((cos(fi(1)))^2+8*(sin(fi(1)))^2));
end


Объявим r и fi глобальными

Код: Выделить всё

global r fi
[r fi]=ode45(@F,[1 300],[pi/2]);


Теперь функция их использует

Код: Выделить всё

function dsdr = SS( r1,s )
 global r fi
 fi1 = interp1(r, fi, r1);
 dsdr(1)= s*fi1/r1;
end


и решение

Код: Выделить всё

[r s]=ode45(@SS,[300 1],[pi]);

Misterry
Пользователь
Сообщения: 4
Зарегистрирован: Вс май 01, 2011 3:25 pm

Re: Решение уравнений!

Сообщение Misterry » Пн май 02, 2011 11:25 am

Огромное спасибо!!! Вы мне очень помогли!

histrix
Пользователь
Сообщения: 7
Зарегистрирован: Вт май 03, 2011 7:45 pm

Сообщение histrix » Ср май 04, 2011 12:07 am

Точно так же использую при решении ДУ функцию, заданную интерполяцией данных из заданных векторов (tau - время, G - значения) для момента времени t:

GG=interp1(tau, G, t);

Это выражение не хочет выполняться, пишет:

??? Error using ==> interp1 at 261
The values of X should be distinct.

Error in ==> ode_test_4_MAYR_erklaerung_PROBE2>dydt at 210
GG=interp1(tau, G, t); .....

Правка спустя 40 мин: вопреки ожиданиям оказалось, что одно повторяющееся значение Х всё же есть (далеко-далеко от того, что должно сначала быть интерполировано, но interp1 на это наплевать!). Мораль сей басни такова: unique для проверки наличия повторяющихся значений в векторе Х очень помогает.
Три пути ведут к знанию: путь размышления - это путь самый благородный, путь подражания - это путь самый легкий и путь опыта - это путь самый горький.

Конфуций