2015-04-10 2 views
1

У меня есть функция, которая имеет некоторые входные параметры, которые являются постоянными. Однако у меня также есть два элемента: Hw и teta, которые должны быть рассчитаны. На самом деле, у меня есть одно уравнение с двумя unkonwns.Как я могу решить нелинейное уравнение с двумя элементами fsolve?

Входные параметры:

D=0.030; 
A=7.0685*10^-4; 
Jo=0.763; 
Jw=0.778090833; 
ro_o=910; ro_w=1000; 
mu_w=0.001; 
mu_o=0.92; 

teta должна быть рассчитана из итеративного процесса, как:

(-2*pi*Hw)+teta-sin(teta)==0 

после расчета teta (первоначальное предположение в [0 2*pi]), мы должны положить его в следующем уравнение для решения для Hw, но проблема teta сама по себе является функцией от Hw.

[Hw, fValue] = fsolve(@(Hw) (((8*ro_o*((D-(2*sqrt(Hw*A/pi)))*(Jo/(1-Hw))*ro_o/mu_o)^-1.0)*(((Jo/(1-Hw))-(Jw/Hw))*((Jo/(1-Hw))-(Jw/Hw))))*(pi*D/2*(2*sin(teta/2)+2*pi-teta)*(1/(1-Hw))))-((0.023*(((Jw*D*ro_w)/mu_w)^-.2)*ro_w*(Jw/Hw)^2*(pi*D))), 0.9); 

Я был бы признателен, если кто-нибудь может мне помочь.

ответ

0

Один из способов - решить для корней обоих уравнений одновременно. fsolve разрешает именно это.

Вы должны превратить свои два скалярных уравнения в один вектор уравнения:

D = 0.030; 
A = 7.0685e-4; 
Jo = 0.763; 
Jw = 0.778090833; 
ro_o = 910; 
ro_w = 1000; 
mu_w = 0.001; 
mu_o = 0.92; 

f = @(x)[-2*pi*x(2)+x(1)-sin(x(1)); 
     (8*ro_o*((D-2*sqrt(x(2)*A/pi))*(Jo/(1-x(2)))*ro_o/mu_o)^-1)* ... 
     (Jo/(1-x(2))-Jw/x(2))^2*pi*D/2*(2*sin(x(1)/2)+ ... 
     2*pi-x(1))/(1-x(2))-0.023*(Jw*D*ro_w/mu_w)^-0.2* ... 
     ro_w*(Jw/x(2))^2*pi*D]; 
x0 = [pi;0.9]; 
[x, fValue] = fsolve(f, x0) 
teta = x(1); 
Hw = x(2); 

, который, для начальных догадок выбранных, возвращает

x = 

    3.182192078148883 
    0.512921423233560 

Выбор других первоначальных предположений, таких как x0 = [0;0.9]; или x0 = [2*pi;0.9];, вернет различные решения.

Возможно, вы заметили, что я удалил из анонимной функции кучу лишних круглых скобок - около 30 на самом деле! Необязательные круглые скобки могут сделать код чтения более сложным и не заменяют знакомство с operator precedence в Matlab. Я также упростил некоторые термины. Вы должны проверить, что все еще правильно.

Это также дурная привычка использовать анонимные функции для сложных сложных уравнений. Их трудно читать и отлаживать, и они менее эффективны, чем обычные функции. Вы должны включить анонимную функцию f в обычную функцию, которая позволит вам разбить длинную часть на значимые термины. Затем передайте дескриптор этой новой функции в fsolve. Если вы хотите передать параметры этой новой функции, см. this article из The MathWorks о параметризации функций. Я также думаю, что вы, вероятно, неправильно написали греческое имя переменной «theta» и, возможно, «rho».

Смежные вопросы