【问题标题】:Unable to code non linear equation in MATLAB R2013a - MATLAB giving warning message无法在 MATLAB R2013a 中编写非线性方程 - MATLAB 给出警告消息
【发布时间】:2026-01-17 18:00:01
【问题描述】:

我想在 MATLAB R2013a 中使用 Symbolic Math Toolbox 求解以下方程。

(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 ]

如何编码?

【问题讨论】:

  • 对于一般n,可能很难找到一个明确的符号解决方案(顺便说一下,Mathmatica 也无法解决这种方程)。你说xyn是“给定的”——这是否意味着你有它们的数值?
  • y=441361, x=66990 & n 的@horchler 值可以是大于 3 的任何数字。
  • n 是整数吗?它是真实价值的还是潜在复杂的?这些都是在解决此类问题时需要明确说明的事情,否则求解器会为您做出假设(可能是错误的假设)。
  • @horchler 抱歉没有提到。 n 是一个整数。

标签: matlab symbolic-math nonlinear-optimization


【解决方案1】:

对于未指定的值n > 3 和未知的r,有无数种解决方案。我希望很清楚为什么——它实际上要求(1+r)^n 的根数越来越多。但是,您可以找到固定值 n 的解决方案。请注意,随着n 变大,解决方案也越来越多,当然其中一些也很复杂。我将假设您只对r 的实际值感兴趣。您可以使用solven = 4n = 5n = 6 的符号数学(对于n = 6,解决方案可能不是一种方便的形式):

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),它将返回另一个解决方案。在有多个解的情况下使用数值方法时,如果您需要特定的解,则需要了解函数的行为,并且需要添加一些巧妙的额外代码来选择初始猜测。

【讨论】:

    【解决方案2】:

    我想你也忘了定义 n。

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

    应该可以解决你的问题:)

    【讨论】:

    • 不,这不起作用。它仍然返回关于找不到任何明确解决方案的相同警告。
    • 好的,抱歉,我试图用 y 和 x 的一些非常简单的组合值(我认为是 1 和 2)来重现问题,至少对于这些值,我得到了一个输出我的代码。但请确保这取决于您的输入 x 和 y,是否可以在不固定 n 的情况下找到显式解决方案,正如您在上面评论的那样。
    • for y=441361, x=66990, n=5 您建议的代码给出了以下消息“警告:无法提取单个解决方案。返回一个 MuPAD 集合对象。> 在解决>assignOutputs 中219 在求解 193 在 GMprogram 中 59 f = (solvelib::VectorImageSet(matrix([[z], [0]]), z, C_) union solvelib::VectorImageSet(matrix([[(log((x + yz)/x) + pik*(2*i))/log(z + 1)], [z]]), [k, z], [Z_, C_减{ -1, 0}])) 相交 solvelib::VectorImageSet(matrix([[u], [z]]), [u, z], [Dom::Interval(3, Inf), C_])