0


私はC++の助けを借りて次の方程式を解こうとしています:3sin(sqrt(x))+ 0.35x --3.8 = 0
解のある領域は[2、3]

です次のコードを書きました:

float f(float x)
{
    return (3 * sin(sqrt(x))) + (0.35 * x) - 3.8; //this is equation i am trying to solve
}

float g(float x, float(*f_ptr)(float)) 
{
    const float CONST = 0.1f; //const used to solve equation

    return CONST * f_ptr(x) + x;
}

void Task4_CalculateSomething()
{
    float x0, //starting aproximation
        xk, //current aproximation
        a = 2, //left barrier
        b = 3, //right barrier
        epsilon = 0.001; //allowed error

    const float REAL_SOLUTION = 2.2985; //real solution of selected equation

    printf("Setup starting aproximation: ");
    scanf("%f", &x0);

    do
    {
        xk = g(x0, f); //calc current aproximation

        if (fabs(xk - x0) < epsilon) //if Xn - Xn-1 fits the allowed error, the solution must be found
            break; //then we exit
        else
            x0 = xk; //else reset x values
    }
    while (fabs(a - x0) > epsilon && fabs(b - x0) > epsilon);

    printf("Found solution: %f\nReal solution: %f\n", xk, REAL_SOLUTION);
}

しかし、それは私に-1。#IND00のような奇妙な結果を与えます。それは私がそれが何であるかさえ知りません。
そして、私はそこにエラーを見つけることができません...

4

2 に答える 2

3

大まかに言えば、何が起こっているのかということです。

  1. アルゴリズムが正しく機能しません。
  2. 特定の反復で、xkは負になります。
  3. それがに渡されるsqrtと、NaNが返されます。
  4. 反復は終了します。
  5. を呼び出すと、がとしてprintf表示されます。NaN-1.#IND00

printfこれらはすべて、デバッガーを使用して、またはデバッグ出力をスローするという昔ながらの手法を使用して識別できます。たとえばxk、ループの各反復で出力するコードを追加します。

解決策が[2,3]にあることを知っているので、私は個人的にブラケット求根アルゴリズムを使用します。たとえば、二等分線

于 2012-05-20T19:00:17.210 に答える
1

次のような別のアルゴリズムを使用してみてください。

  1. 関数の導関数を記述します:der = 1.5 * cos(sqrt((x))/ sqrt(x)+。35
  2. 次の値はxk=x0-mysinc(x0)/ der(x0)です

いくつかのステップで解決策になります...または変数CONSTの動的値を-1/der(x)にします。

于 2012-05-20T21:03:06.457 に答える