找到方程解的简单方法

时间:2010-09-07 10:41:17

标签: math matlab equation-solving

我有以下等式:

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 个答案:

答案 0 :(得分:3)

如果你有

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

然后你知道

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

假设您要扩展这些条款?合并为一个简单的三次方程,实系数等于零?是否有能够为您解决的功能?

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

答案 1 :(得分:2)

以下是Wolfram Alpha对N = 10的解决方案:

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

代数解决方案适用于您的特定情况,因为它并不十分困难。问题在于,通常,非线性方程需要迭代解决方案:从猜测开始,沿特定方向步进,并希望收敛到解决方案。一般没有迭代和循环,你无法求解非线性方程。

答案 2 :(得分:1)

将等式重新排列为0 = f(x)/g(x)(其中fg为多项式)。然后求解0 = f(x)。这应该很容易,因为f将是立方(http://en.wikipedia.org/wiki/Cubic_function#Roots_of_a_cubic_function)。实际上,Matlab具有roots()功能来执行此操作。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

你可以以封闭的形式解决这个等式,正如其他答案中所讨论的那样,但是对于多项式的度数&gt;诚实地说,封闭式解决方案。 2在实践中不是很有用,因为结果往往条件差。

对于你的特殊多项式,我同意亚力山大认为牛顿的方法可能是要走的路。

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

答案 5 :(得分: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指出的那样,用数值方法解决问题需要迭代(因此它很慢),并且求解器可能陷入局部最小值。