プロが教えるわが家の防犯対策術!

#include <stdio.h>
#include <math.h>

float f( float x, float v);
float fd( float x, float v);
int newton( float x0, float v, float accuracy, int max_calc, float *x, int *n);

main()
{
float x0, v, accuracy, x;
int max_calc, n, error;
x0 = 1.4;
v = 1.5;
max_calc = 0;
accuracy = 0.;
error = newton( x0, v, accuracy, max_calc, &x, &n);
if(error == 1)
{
printf("x=%f,n=%f\n", x, n);
}
else
{
printf("正常終了しなかった\n");
}
}

int newton( float x0, float v, float accuracy, int max_calc, float *x, int *n)
{
float x1, y1, yd1, x2, dx;
int error;
*n = 1;
error = 0;
x1 = x0;

while(!error)
{
y1 = f(x1, v);
yd1 = fd(x1, v);
x2 = x1 - y1 / yd1;
dx = fabs(x1 - x2);
if(dx < accuracy)
{
*x = x2;
printf("error=1\n");
}
else if(0 < x1 < v)
{
*x = x2;
printf("error=2\n");
}
else if(*n > max_calc)
{
*x = x2;
printf("error=3\n");
}
else{
printf("x2=%f,*n=%f,dx=%f\n", x2, *n, dx);
x1 = x2;
*n = *n + 1;
}
}
return error;
}

float f(float x, float v)
{
float fx, a, b, c, d, e;

fx = 0.;

a = x * tan(x);
b = x * x;
c = v * v;
d = c - b;
e = sqrt(d);
fx = a - e;
return fx;
}

float fd(float x, float v)
{
float fxl, a1, a2, a3, a4, a5, a6, a7;

fxl = 0.;

a1 = tan(x);
a2 = x / cos(x) / cos(x);
a3 = x * x;
a4 = v * v;
a5 = a4 - a3;
a6 = sqrt(a5);
a7 = x / a6;
fxl = a1 + a2 + a7;
return fxl;
}



xの初期値x0、vの初期値を1.4,1.5にして
f(x)=0を満たすxのv依存性を精度accuracy=1x10^(-6)で求め図に示せ。ただし0<v<π/2とする。

という問題なのですが上のプログラムをコンパイルして実行しても
error=2が永遠とでてきます。
どこをどうすればいいんでしょうか?
あと、gnuplotを使って図に示すのですが、
accuracy=1×10^(-6)の示し方と0<v<n/2の範囲の決め方がわかりません。
本当に分からないんです。(TT)
親切な方、詳しく教えてください。待ってます。。。

A 回答 (2件)

とりあえず、if(0 < x1 < v)


があなたの意図と違う結果を返している可能性があるので、まずこれ読んで下さい。
https://www.jpcert.or.jp/sc-rules/c-exp13-c.html
    • good
    • 1

とりあえず


0 < x1 < v
が C でどういう意味を持つか考えよ.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!