【发布时间】:2020-03-22 15:38:18
【问题描述】:
我要estimate multiplicity of polynomial roots.
我找到了一些info about it,选择了测试示例并制作了c程序
这里应该是 4 个根。一个单根和一个重数 3。
#include <complex.h>
#include <math.h>
#include <stdio.h>
complex long double z0 = +1.5; // exact period = 1 stability = 3.000000000000000000 multiplicity = ?
complex long double z1 = -0.5; // exact period = 2 stability = 0.999999999999900080 multiplicity = ?
complex long double c = -0.75; // parameter of the f function
/*
https://en.wikibooks.org/wiki/Fractals/Mathematics/Newton_method
*/
int GiveMultiplicity(const complex long double c, const complex long double z0 , const int pMax){
complex long double z = z0;
complex long double d = 1.0; /* d = first derivative with respect to z */
complex long double e = 0.0; // second derivative with respect to z
complex long double m;
int multiplicity;
int p;
for (p=0; p < pMax; p++){
d = 2*z*d; // f' = first derivative with respect to z */
e = 2*(d*d +z*e); // f'' = second derivative with respect to z
z = z*z +c ; // f = complex quadratic polynomial
}
m = (d*d)/(d*d -z*e);
multiplicity = (int) round(cabs(m));
return multiplicity;
}
int main(){
int m;
m = GiveMultiplicity(c, z0, 1);
printf("m = %d \n", m);
m = GiveMultiplicity(c, z1, 1);
printf("m = %d \n", m);
m = GiveMultiplicity(c, z1, 2);
printf("m = %d \n", m);
return 0;
}
结果是:
m=1
m=1
m=1
好吃吗?也许我应该简单地添加结果?
使用符号计算的良好结果是根:[3/2,-1/2] 及其多重性:[1,3]
这是函数 f(z)= (z^2-0.75)^2-z-0.75 = z^4-1.5*z^2-z-3/16 的图
是否可以用数值计算相似的值?
【问题讨论】:
-
我不知道数值学家是如何解决这个问题的,但是如何移动变量以使原点为零,并计算微小的低阶系数?
-
@YvesDaoust 你的意思是符号方法吗?
-
不,数字。
-
你应该在
d之前更新e? -
@Adam 如果我在
d之前更新e,并在循环之后d -= 1对应z -= z0,并且也 扰乱输入z0通过(不是太大,也不是太小)值(例如h = 1e-5)然后我得到正确的答案——需要扰乱以避免 0/0 和 NaN
标签: c nan numerical-methods complex-numbers polynomial-math