在Matlab中求解一个简单的非线性方程

时间:2013-07-14 17:36:32

标签: matlab solver

我有以下问题:

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

我得到的输出是:

z = 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

但是,我需要一个数字解决方案。任何人都可以推荐一种noob友好的方法吗?

谢谢!  (感谢@horchler帮助我重新解释这个问题)

2 个答案:

答案 0 :(得分: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的具体值),多项式的顺序就越高。正方形和立方体的根源很容易找到。 Quartical(具有常系数)也可以被考虑在内。一些quintics也可以,但是对于更高的订单,很少有已知的分析解决方案。您可能需要使用数字技术来获得解决方案。

修改: 对于您的等式,您可以尝试替换:让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

答案 1 :(得分:0)

我相信我自己使用fzero函数找到了一个不错的解决方案:

>> f=@(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