Scilab fsolve возвращает неверный аргумент (ошибка 98)

Я пытаюсь запустить fsolve для решения уравнения диссоциации, но продолжаю получать эту ошибку. Я отследил его до термина x(1)^(1/2) (удаление квадратного корня не дает ошибки), но я не могу найти способ решить нужное мне уравнение. Код ниже.

T = 2000
Kp = exp(-deltaG/(Ru*T))

function [f]=func(x)
    f(1) = 2-x(1)*4 / (3*x(1) - 1)*(x(1))^(1/2) - Kp
endfunction

x0 = [1]
[x,f_x] = fsolve(x0,func)

EDIT: дополнительная запрашиваемая информация

Ошибка

!--error 98 переменная, возвращаемая аргументной функцией scilab, неверна

Ru — газовая постоянная, 8.315.

DeltaG is -135643.

Kp is 3.489e-3.

Это пример из книги, x должно дать 0.3334.

Что вроде решило эту проблему, так это то, что я обновил scilab до версии 6.0.1 с 5.5. Проблема в том, что в зависимости от начального предположения x0 значения x становятся действительно абсурдными, а x0 должно быть настолько близко к реальному ответу, что это противоречит цели расчета.

Также у меня нет доступа к Maple, другой моей альтернативой будет MATLAB.


person Fredh Rodrigues    schedule 26.03.2018    source источник
comment
Можете ли вы сказать нам, каким должен быть ожидаемый результат? И какие значения вы использовали для detalG и Ru? Вам нужно добавить эту информацию к вашему вопросу.   -  person luispauloml    schedule 27.03.2018
comment
Кроме того, вы должны вставить полученную ошибку.   -  person PTRK    schedule 27.03.2018
comment
Глядя на ваш код, поскольку вы вычисляете квадратный корень, вы можете получить комплексное значение, зависящее от значения deltaG и R. fsolve работает только с вещественными числами. Поэтому обязательно отвечайте на вопросы @luispauloml.   -  person PTRK    schedule 27.03.2018
comment
Вы, ребята, правы, извините. Я отредактирую вопрос.   -  person Fredh Rodrigues    schedule 28.03.2018
comment
У вашей функции есть одна большая проблема: производная от func очень близка к нулю для всех точек, за исключением разрыва около 0,3333, что также очень близко к решению func (см. i.stack.imgur.com/j8AoI.png). Из-за этого fsolve возвращает номер индикатора завершения. 4, это означает, что итерация не продвигается должным образом. Вам следует попробовать другой метод, например optim или fminsearch, который позволяет выбирать и настраивать различные алгоритмы.   -  person luispauloml    schedule 01.04.2018


Ответы (1)


Используя программное обеспечение для символьного исчисления, такое как xcas или Maple, можно символически решить уравнение. Существует 3 решения:

  s1=((1/4)*t1+(1/4)*(Kp-2)^2/t1-(1/4)*Kp+1/2)^2

  s2=(-(1/8)*t1-(1/8)*(Kp-2)^2/t1-(1/4)*Kp+1/2+(1/2*%i)*sqrt(3)*((1/4)*t1-(1/4)*(Kp-2)^2/t1))^2

  s3=(-(1/8)*t1-(1/8)*(Kp-2)^2/t1-(1/4)*Kp+1/2-(1/2*%i)*sqrt(3)*((1/4)*t1-(1/4)*(Kp-2)^2/t1))^2

куда

  t=sqrt(-Kp*(Kp-4)*(Kp-2)^2)
  t1=(-(Kp-2)*(Kp-2*sqrt(2))*(Kp+2*sqrt(2))+4*t)^(1/3);

в зависимости от значений Kp некоторые решения могут быть сложными.

person user5694329    schedule 27.03.2018