Повторите, чтобы найти значение (X) в Matlab

У меня есть следующее уравнение

(250-25)/((0.0106+1.89799*10^-3)+(log(x/15)/2*3.14*45)+(1/10*2*3.14*x))...
    ==157.19;

Я пытаюсь найти значение x, чтобы правая часть была равна левой.

до сих пор я пробовал следующее без везения

syms x
eqn=(250-25)/((0.0106+1.89799*10^-3)+(log(x/15)/2*3.14*45)+(1/10*2*3.14*x))...
    ==157.19;
solve(eqn,x)

и результат

ans =

(225*lambertw(0, (2*exp(8035698630091128826615/400116850530983344078848))/15))/2

person Mohamed Maher    schedule 09.12.2014    source источник
comment
Если вы примените решение по ссылке выше к своему ans, вы получите 13.5658.   -  person Schorsch    schedule 09.12.2014
comment
Здесь нет вопросов. Изменить, чтобы добавить конкретный вопрос.   -  person horchler    schedule 09.12.2014


Ответы (1)


Вместо этого попробуйте использовать численный метод. Вы все равно не используете рациональные числа, так что даже если ваше символьное решение сработает, ответы не будут иметь смысла.

Затем сделайте следующее:

1) Определите свою функцию как

f = @(x)(250-25)./((0.0106+1.89799*10^-3)+(log(x./15)/2*3.14*45)+(1/10*2*3.14.*x))-157.19

где -157,19 — правая часть (это обычно делается при решении уравнения, потому что тогда можно использовать метод для нахождения корня, например, метод Ньютона-Рафсона).

2) Здесь есть журнал усложнения (отрицательное число) становится сложным. Это значит, что fzero здесь работать не будет (не важно, что это не в вашем домене). К счастью, в Matlab есть другой решатель численных уравнений, который может справиться с этим fsolve.

Чтобы решить уравнение, попробуйте

myRoot = fsolve(f,15) % Number is tested to work good in this case and not
                      % a general best guess for numerical solutions

Если вы попытаетесь пойти другим путем, у вас будет ошибка округления для комплексных чисел. Пытаться,

myRoot = fsolve(f,4)

это означает, что для получения действительного решения вам нужно удалить мнимую часть ответа (здесь это безопасно, поскольку вы знаете, что мнимая часть получается из-за ошибки округления).

myRoot = real(fsolve(f,4))
person patrik    schedule 09.12.2014
comment
Хороший ответ! (И ваш комментарий был, конечно, правильным, хороший улов) =) - person Stewie Griffin; 09.12.2014
comment
Кстати, что-то вроде fzero(f,[13.33 20]) действительно работает. Нижняя граница должна быть найдена так, чтобы происходила смена знака, поэтому нужно знать приблизительное значение корня. fsolve в этом случае, очевидно, гораздо более надежный общий решатель. - person horchler; 10.12.2014
comment
@horchler Понятно, извините за резкий тон. Я тоже удалил свой комментарий. - person patrik; 10.12.2014