2013-07-14 7 views
0

У меня следующая проблема:Решение простое нелинейное уравнение в Matlab

y=5; 
syms x; 
z = 1:5; 
solve(exp(x*max(z))/sum(exp(x*z))-y,x) 

Выход я получаю:

г = 1: 5;

Warning: The solutions are parametrized by the symbols: 
z1 = {0.08428351324821874240165938567037 - 
2.5448937468890335808057943875982*I, 0.027288262408886135481488159484547 
- 1.2999621981120554573735787663938*I, 
0.08428351324821874240165938567037 + 
2.5448937468890335808057943875982*I, 0.027288262408886135481488159484547 
+ 1.2999621981120554573735787663938*I} 

> In solve at 94 
ans = 
z1 

Однако мне нужно числовое решение. Может ли кто-нибудь порекомендовать дружелюбный подход?

Спасибо! (Спасибо @horchler за помощь мне перефразировать вопрос)

ответ

0

я предполагаю, что x является символическим переменным, а вектор z числовой? Так, что-то вроде этого:

syms x y; 
z = 1:5; 
solve(exp(x*max(z))/sum(exp(x*z))==y,x) 

который возвращает

Warning: The solutions are parametrized by the symbols: 
z1 = RootOf(y*z^4 - z^4 + y*z^3 + y*z^2 + y*z + y, z) 

> In solve at 180 

ans = 

    log(z1) 

solve действительно дает вам решение, просто не явно один. Он говорит вам, что у вас есть несколько решений, которые являются корнями некоторого полинома. Чем больше элементов, чем z имеет (и в зависимости от конкретных значений z), тем выше будет порядок полинома. Корни квадратики и кубики легко найти. Квартики (с постоянными коэффициентами) также могут быть учтены. Некоторые квинтики тоже могут быть, но для более высоких заказов очень мало известных аналитических решений для корней. Вероятно, вам понадобится использовать числовые методы для получения решений.

EDIT: Для вашего уравнения можно попробовать замену: пусть xp = exp(x). Тогда ваша версия solve может иметь более легкое время. Итак:

syms xp; 
y = 5; 
z = 1:5; 
log(solve(xp^max(z)/sum(xp.^z)==y,xp)) 

который возвращает

ans = 

    0.027288262408886135481488159484547 - 1.2999621981120554573735787663938*i 
    0.027288262408886135481488159484547 + 1.2999621981120554573735787663938*i 
    0.08428351324821874240165938567037 - 2.5448937468890335808057943875982*i 
    0.08428351324821874240165938567037 + 2.5448937468890335808057943875982*i 
+0

Спасибо за ваш ответ, Horchler! x - числовая переменная. Вот именно то, что мне нужно: >> y = 5; >> syms x; z = 1: 5; решения (ехр (х * макс (г))/сумма (ехр (х * г)) - у, х) Это возвращает следующее: Внимание: параметризованные символами: z1 = {0.08428351324821874240165938567037 - 2,5448937468890335808057943875982 * I, 0,027288262408886135481488159484547 .............. > В решении по 94 ANS = z1 Могли бы вы порекомендовать численного решения, так как я потребуется более высокие заказы? –

+0

@SimbatSeaman: Вы уверены? если 'y' - числовая константа, это намного проще. На R2012b я сразу получаю один комплексный числовой корень, если я введу то, что вы написали: '0.027288262408886135481488159484547 - 1.2999621981120554573735787663938 * i'. Если я добавлю параметр '' IgnoreAnalyticConstraints'' и поставлю его в 'true', я получу две пары комплексно-сопряженных решений (не знаю, все ли это решения).Какую версию Matlab вы используете? – horchler

+0

Также вы говорите, что «x» является числовым, а затем вы создаете его как символическую переменную? – horchler

0

Я полагаю, что я нашел достойное решение сам, используя функцию fzero:

>> [email protected](x,y,z)exp(x*max(z))/sum(exp(x*z))-y; 
    z=-0.1:0.005:0.015; 
    y=0.52; 
    x=fzero(@(x) f(x,y,z),50) 
x = 
    146.7938 
+0

Это единственное реальное решение для этого набора параметров - это то, что вы хотите? Есть также одиннадцать пар комплексных сопряжений в соответствии с 'решаем'. Другие комбинации могут иметь несколько реальных корней. – horchler

+0

Да, это именно то, что я искал. Я думаю, «решить» было неправильное место для начала. –

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