无法在MATLAB R2013a中编写非线性方程 - MATLAB给出警告信息

时间:2014-08-26 10:37:40

标签: matlab symbolic-math nonlinear-optimization

我想使用符号数学工具箱在MATLAB R2013a中解决以下等式。

(y/x)-(((1+r)^n)-1)/r=0  where y,x and n>3 are given and r is the dependent variable

我试过自己&编码如下:

f=solve('(y/x)-(((1+r)^n)-1)/r','r')

但由于r的解决方案并不精确,即它在连续迭代时收敛,因此MATLAB正在给出一条带有消息的警告输出

Warning: Explicit solution could not be found.
 f =

[ empty sym ]

我该如何编码?

2 个答案:

答案 0 :(得分:0)

我想你也忘了定义n。

     f=solve('(y/x)-(((1+r)^n)-1)/r=0','n-3>0','r','n')

应该解决你的问题:)

答案 1 :(得分:0)

对于n > 3和未知r的未指定值,有无数的解决方案。我希望非常清楚为什么 - 它有效地要求(1+r)^n的根源越来越多。但是,您可以找到固定值n的解决方案。请注意,随着n越来越大,有越来越多的解决方案,当然其中一些很复杂。我假设你只对r的真实价值感兴趣。您可以对n = 4n = 5n = 6使用solve和符号数学(对于n = 6,解决方案可能不方便):< / p>

y = 441361;
x = 66990;
n = 5;
syms r;
rsol = solve(y/x-((1+r)^n-1)/r==0,r,'IgnoreAnalyticConstraints',true)
double(rsol)

然而,问题是“您是否需要所有解决方案或仅针对给定值n”的特定解决方案?如果您只需要一个特定的解决方案,那么您根本不应该使用符号数学,因为它较慢并且存在实际问题,例如您遇到的问题。您只需使用数值方法即可找到接近指定初始猜测的方程零。 fzero是在单个变量中解决此类问题的标准函数:

y = 441361;
x = 66990;
n = 5;
f = @(r)y/x-((1+r).^n-1)./r;
r0 = 1;
rsol = fzero(f,r0)

您将看到返回的值与上面符号解决方案中的一个解决方案相同。如果您调整初始猜测r0(比如说​​r0 = -3),它将返回另一个解决方案。在有多个解决方案的情况下使用数字方法时,如果您需要特定的解决方案,则需要了解函数的行为,并且需要添加一些聪明的额外代码来选择初始猜测。