|
> 3x^3-6x^2-3x+6の解をニュートンラフソン法で求めたいのですが、
3x^3-6x^2-3x+6 は関数であり、解はありません。
3x^3-6x^2-3x+6 = 0 という 3次方程式の解を求めるのですね。
因数分解すると、3(x+1)(x-1)(x-2) = 0 ですから、解は、-1、1、2 です。
さて、Newton-Raphson法を使うときは、微分が必要です。
f(x) = 3x^3-6x^2-3x+6 のとき、
f'(x) = 9x^2-12x-3 ですから、プログラムは次のようになります。
初期値の与え方で求める結果が変わってきます。
#include <stdio.h>
#include <math.h>
double f(double x) { return 3*x*x*x - 6*x*x - 3*x + 6; }
double f1(double x) { return 9*x*x - 12*x - 3; }
void newton(double x0)
{
double x1;
printf("x0 = %5.1f --> ", x0);
for (;;) {
x1 = x0 - f(x0)/f1(x0);
if (fabs(x1 - x0) < 1e-6) break;
x0 = x1;
}
printf("x1 = %5.1f\n", x1);
}
int main(void)
{
double x;
for (x = -1.1; x < 2.2; x += 0.2)
newton(x);
return 0;
}
|