-2

元の質問:

放物線の方程式を見つけるには

y = A + Bx + Cx ^ 2

n個のデータポイントのセットに最もよく適合する場合、A、B、およびCの値を決定する必要があります。この値について、式を使用して予測されたy値からの観測されたy値の偏差の2乗の合計は次のようになります。可能な限り小さい。これらの値は、線形システムを解くことによって求められます。

nA +(Ex)B +(E(x ^ 2))C = Ey

(Ex)A +(Ex ^ 2)B +(Ex ^ 3)C = E(xy)

(Ex ^ 2)A +(Ex ^ 3)B +(Ex ^ 4)C = E((x ^ 2)y)

E=合計概念=資本シグマ

次のデータポイントのセットについて、最小二乗放物線の方程式を見つけます。

データX/0.05、0.12、0.15、0.30、0.45、0.70、0.84、1.04 /

データY/0.957,0.851,0.832,0.720,0.583,0.378,0.295,0.156 /

コードでいくつかのエラーが発生しましたが、どこが間違っているのかよくわかりません。連立一次方程式から「データの重み(A、B、C)」を手作業で計算しました。

エラーログは次のとおりです。

--------------------構成:FIT-Win32デバッグ--------------------

Fortranのコンパイル...

C:\ MSDEV \ FIT.f​​90

C:\ MSDEV \ FIT.f​​90(34):警告FOR4265:シンボルMが参照されていますが、設定されていません

リンクしています...

FIT.obj:エラーLNK2001:未解決の外部シンボル_GAUSS @ 24

FIT.exe:致命的なエラーLNK1120:1つの未解決の外部

link.exeの実行中にエラーが発生しました。

FIT.exe-2つのエラー、1つの警告

これは私の現在のプログラムコードです:

        PROGRAM FIT
    REAL X(8),Y(8),LIN,QUAD,WEIGHTS(3)
    EXTERNAL LIN,QUAD
    DATA X / 0.05, 0.12, 0.15, 0.30, 0.45, 0.70, 0.84, 1.04  /
    DATA Y / 0.957,0.851,0.832,0.720,0.583,0.378,0.295,0.156 /
    DATA WEIGHTS / -0.245866582919757, 4.19120539122495, 3.92469397298994 /
    CALL GENLSQ(X,Y,8,LIN,QUAD,WEIGHTS)
    PRINT *,'THE WEIGHTS ARE'
    PRINT *, WEIGHTS
    STOP
    END

    SUBROUTINE GENLSQ(X,Y,N,F,G,WEIGHTS)
    INTEGER N
    REAL X(N), Y(N), MATRIX(3,4),WEIGHTS(3)
    EXTERNAL F,G
    DATA MATRIX / 12*0.0 /
    MATRIX(1,1) = FLOAT(N)
    DO 1 I = 1, M
    MATRIX(1,2) = MATRIX(1,2) + F(X(I))
    MATRIX(1,3) = MATRIX(1,3) + G(X(I))
    MATRIX(1,4) = MATRIX(1,4) + Y(I)
    MATRIX(2,2) = MATRIX(2,2) + F(X(I)) ** 2
    MATRIX(2,3) = MATRIX(2,3) + F(X(I))*G(X(I))
    MATRIX(2,4) = MATRIX(2,4) + F(X(I))*Y(I)
    MATRIX(3,3) = MATRIX(3,3) + G(X(I)) ** 2
    MATRIX(3,4) = MATRIX(3,4) + G(X(I))*Y(I)
1       CONTINUE
    MATRIX(2,1) = MATRIX(1,2)
    MATRIX(3,1) = MATRIX(1,3)
    MATRIX(3,2) = MATRIX(2,3)
    CALL GAUSS(MATRIX,3,4,3,WEIGHTS,SINGUL)
    RETURN
    END

    REAL FUNCTION LIN(X)
    LIN=X
    RETURN
    END

    REAL FUNCTION QUAD(X)
    QUAD=X*X
    RETURN
    END

どんな助けでも大歓迎です!ありがとう、ジョー

4

2 に答える 2

0

implicit noneプロシージャを使用して、モジュールとそのモジュールに配置する方がよいでしょうuse。の代わりにexternal。1つ目は、コンパイラが宣言されていない変数を通知するようにします。2つ目は、コンパイラーがプロシージャー呼び出しの引数の整合性をチェックできるようにします。

module my_subs

implicit none

contains

   SUBROUTINE GENLSQ
   ....
   end SUBROUTINE GENLSQ

   FUNCTION LIN(X)
   real :: LIN
   real, intent (in) :: x
   LIN = X
   end FUNCTION LIN(X)

   FUNCTION QUAD(X)
   real :: QUAD
   real, intent (in) :: x
   QUAD=X*X
   end FUNCTION QUAD

end module my_subs


program fit

use my_subs

implicit none

.....

END program fit
于 2013-03-16T02:25:00.263 に答える
0

C:\MSDEV\FIT.f90(34): warning FOR4265: symbol M referenced but not set

AFAICT、ループ制限 M を定義することは決してありません。それはあらゆる種類のいたずらを引き起こすはずです。

于 2013-03-15T21:52:35.207 に答える