2010-09-07 104 views
1

的解决方案,我有以下公式:简单的方法来找到方程

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

我需要创建指定N发现lam的功能。

现在我正在做使用简单的循环:

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 

我怎样才能解决这个问题更准确,更没有使用循环?

回答

3

如果你有

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

那么你知道

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

假设你是扩大这些条款?合并成一个简单的三次方程,实系数等于零?有没有可以为你解决的功能?

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

+0

或者只是将方程式放在Maxima(free)中,并要求它解决lam。 – phkahler 2010-09-07 11:14:45

+0

或Wolfram Alpha。 – duffymo 2010-09-07 11:33:45

+0

谢谢,'fzero'的工作相当好:) – Gacek 2010-09-16 20:23:15

2

下面是Wolfram Alpha的为N = 10的解决方案:

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

代数解决方案为您的特定情况下工作,因为它不是非常困难。问题在于,一般而言,非线性方程需要迭代求解:从猜测开始,沿特定方向开始,并希望收敛到解决方案。一般情况下,您无法求解非线性方程,而无需迭代和循环。

1

绘图表明,对于N正数,区间[-1,1)中只有一个解。你应该考虑Newton's method,它会很快收敛为零初始猜测。

+0

事实上,在间隔(0,1) – Gacek 2010-09-09 08:59:36

0

有一个代数问题的解决方案为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所指出的那样,用数值方法解决问题需要迭代(所以速度很慢),解算器可能会陷入局部最小值。

+2

中总是应该有一个解决方案,我敢打赌10美元牛顿的方法与仔细选择的初始猜测比这个更快。 – 2010-09-08 17:22:47

+0

我会非常惊讶,尽管这是相对有效的,尽管是丑陋的。但我很乐意被证明是错误的。 – Kena 2010-09-27 20:14:18

1

如其他答案中所讨论的那样,您可以用封闭形式解这个方程,但老实说,对于度数> 2的多项式的封闭形式解在实践中并不是非常有用,因为结果往往条件欠佳。

对于您的特定多项式,我同意亚历山大说牛顿的方法可能是要走的路。从长远来看,尽管如此,我强烈建议编写(或从Internet重用)Jenkins-Traub根发现算法的实现。维基百科将其描述为“实际上是黑箱多项式根找到者的标准”,并且它们并不夸张。它满足了我多年来解决多项式的所有需求;根据我的经验,它比牛顿的方法更强大(不依赖于最初的猜测)和基于特征值的方法,而且启动速度相当快。

+0

我可以第二个事实是封闭形式求解器在2或3度以外不是非常稳定的数字。 仅供参考有一个名为[RPOLY ++]的Jenkins-Traub算法的开源C++实现(BSD许可证)(https://github.com/sweeneychris/RpolyPlusPlus) – kip622 2015-09-20 15:02:54