を計算する超手抜きコードを30分で書いた。
Det|M-xI|=0の三次方程式をニュートン法で解いてる。初期値はまんなかの変曲点 -c2/3 と、微分0になる二箇所 -c2/3±sqrt(c2*c2-3*c1)/3の外側。解がないとか収束判定とかまったく考えてない。
static double newton3(double x0, double c0, double c1, double c2) { double x = x0; int i; for(i=0;i<1000;i++) { double f = x*x*x + c2*x*x+c1*x +c0; double df = 3*x*x + 2*c2*x + c1; x -= f/df; } return x; } extern void mat_eig3(double m[3][3], double v[3]) { double m11=m[0][0]; double m22=m[1][1]; double m33=m[2][2]; double m12=m[0][1]; double m23=m[1][2]; double m31=m[2][0]; double c0 = -m11*m22*m33 -2*m12*m23*m31 +m11*m23*m23 +m22*m31*m31 +m33*m12*m12; double c1 = m22*m33+m33*m11+m11*m22 - (m23*m23 + m12*m12 + m31*m31); double c2 = -(m11+m22+m33); v[1] = newton3( -c2/3.0, c0, c1, c2); v[0] = newton3( -c2/3.0 - 2*sqrt(c2*c2-3*c1)/3, c0, c1, c2); v[2] = newton3( -c2/3.0 + 2*sqrt(c2*c2-3*c1)/3, c0, c1, c2); }