代码之家  ›  专栏  ›  技术社区  ›  Gacek

求方程解的简便方法

  •  1
  • Gacek  · 技术社区  · 14 年前

    f(N):  N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));
    

    我需要创建一个函数 lam 对于指定的 N

    现在我使用简单循环:

    lam = 0.9999;
    n = f(lam);
    pow = 0;
    delta = 0.1;
    while(abs(N - n)) > 0.1 & pow < 10000)
        lam = lam - 0.001;
        n = f(lam)
        pow = pow+1;
    end
    

    6 回复  |  直到 14 年前
        1
  •  3
  •   user85109 user85109    14 年前

    N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))
    

    那你就知道了

    (1+lam)^3 = N*(1-lam)*(1+lam^2)
    

    答案是肯定的。一种解决方案可能是使用fzero,但是由于方程只是一个三次多项式,所以根就是答案,除非你需要一个符号解。使用符号工具箱解决符号问题。

        2
  •  2
  •   duffymo    14 年前

    http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10
    

    没有

        3
  •  1
  •   Oliver Charlesworth    14 年前

    重新排列方程 0 = f(x)/g(x) (其中 f g 是多项式)。然后解决 0 = f(x) . 这应该很简单 将是立方的( http://en.wikipedia.org/wiki/Cubic_function#Roots_of_a_cubic_function ). 事实上,Matlab有 roots()

        4
  •  1
  •   Alexandre C.    14 年前

    绘图表明,对于N正,在区间[-1,1]中正好有一个解。你应该考虑 Newton's method ,它将很快收敛到零初始猜测。

        5
  •  1
  •   user168715    14 年前

    正如其他答案中所讨论的,您可以用封闭形式来求解此方程,但老实说,对次数大于等于2的多项式的封闭形式解在实践中并不是很有用,因为结果往往条件较差。

    对于你的特定多项式,我同意亚历山大牛顿的方法可能是一种方法。

    不过,从长远来看,我强烈建议编写(或从Internet重用)Jenkins-Traub根查找算法的实现。维基百科将其描述为“实际上是黑盒多项式根查找器的标准”,他们并不夸张。多年来,它满足了我所有的多项式求解需求;根据我的经验,它比牛顿法(不依赖于良好的初始猜测)和基于特征值的方法更健壮,而且启动速度也相当快。

        6
  •  0
  •   Kena    14 年前

    对于N的大多数值,你的问题有一个代数解 Wolfram Alpha :

    if N+1!=0
       x = (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3)/(3 2^(1/3) (N+1))-(2^(1/3) (2 N^2+3 N))/(3 (N+1) (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3))+N/(3 (N+1))
    

    是的,很难看。

    如果你有一个,一个精确的代数解,甚至像这样一个大的丑陋的,总是优于一个数值解。正如duffymo所指出的,用数值方法解决问题需要迭代(因此速度很慢),而且解算器会陷入局部极小。