新しく発言する  EXIT  インデックスへ

数値微分式


  数値微分式 しばっち 2008/03/19 21:46:52 
  どのように使うのですか 島村1243 2008/03/20 10:01:11 
  │└返事 しばっち 2008/03/20 13:22:28 
  │ └有難うございます。 島村1243 2008/03/21 22:18:20 
  │  └!Richardsonの補外法(extrapolation) 山中和義 2008/03/22 13:40:09 
  │   └こんなに短いコードで 島村1243 2008/03/22 17:14:23 
  可変精度数値微分 しばっち 2008/03/20 21:07:22  (修正1回)
  │├F=X^2を試したら 島村1243 2008/03/22 10:23:28  (修正1回)
  ││└ご指摘ありがとうございます。こちらのミス... しばっち 2008/03/22 14:59:11 
  ││ └完璧でした。 島村1243 2008/03/22 16:36:45 
  │└可変精度高階数値微分 しばっち 2008/03/23 09:54:12 
  高階数値微分式 しばっち 2008/03/22 17:21:13 

  数値微分式 しばっち 2008/03/19 21:46:52   ツリーへ
数値微分式  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/19 21:46:52
LET MAXLEVEL=19
DIM L(MAXLEVEL),M(MAXLEVEL)
FOR N=3 TO MAXLEVEL STEP 2
FOR I=1 TO N
LET H=1
FOR J=1 TO N
IF I<>J THEN LET H=H*(I-J)
NEXT J
LET L(I)=H
NEXT I
!'FOR P=1 TO N
LET P=INT(N/2+1) !'中央差分式
FOR K=1 TO N
LET S=0
FOR I=1 TO N
LET H=1
FOR J=1 TO N
IF K<>J AND I<>J AND K<>I THEN
LET H=H*(P-J)
LET FL=1
END IF
NEXT J
IF FL=1 THEN
LET S=S+H
LET FL=0
END IF
NEXT I
LET M(K)=S
NEXT K
PRINT "F'(X)=";
FOR I=1 TO N
LET GM=GCD(M(I),L(I))
LET M(I)=M(I)/GM
LET L(I)=L(I)/GM
NEXT I
LET LM=L(1)
FOR I=2 TO N
LET LM=LCM(LM,L(I))
NEXT I
FOR I=1 TO N
LET B=LM/L(I)
LET M(I)=M(I)*B
LET L(I)=L(I)*B
NEXT I
PRINT "(";
FOR I=1 TO N
IF M(I)*L(I)<0 THEN PRINT "-"; ELSE PRINT "+";
PRINT STR$(ABS(M(I)));"*F(X";
IF (P-I)<0 THEN PRINT "+"; ELSE PRINT "-";
PRINT STR$(ABS(P-I));"*H)";
NEXT I
PRINT ")/(";STR$(ABS(L(1)));"*H)"
!'NEXT P
NEXT N
END

EXTERNAL FUNCTION LCM(M,N)
LET LCM=M*N/GCD(M,N)
END FUNCTION

EXTERNAL FUNCTION GCD(M,N)
DO WHILE N<>0
LET T=MOD(M,N)
LET M=N
LET N=T
LOOP
LET GCD=M
END FUNCTION
  どのように使うのですか 島村1243 2008/03/20 10:01:11   ツリーへ
Re: 数値微分式  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/20 10:01:11
どのように使うのですか

いつも興味を持って見させて頂いておりますが、どの様に
使うのかが分からず残念です。最初に目的や使い方の簡単
なコメントを記載して頂けると有難いです。
  │└返事 しばっち 2008/03/20 13:22:28   ツリーへ
Re: どのように使うのですか  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/20 13:22:28
返事


単に数値微分式を求めさせているだけで、特に使い道は考えておりませんが
計算された式の1つをテキストウィンドウからコピペし、FUNCTIONで定義します。
使う式によって精度が違います。

FUNCTION DIFF(X)
LET DIFF=(-1*F(X-3*H)+9*F(X-2*H)-45*F(X-1*H)+0*F(X-0*H)+45*F(X+1*H)-9*F(X+2*H)+1*F(X+3*H))/(60*H)
END FUNCTION

微分値を求めたい関数も定義します。

FUNCTION F(X)
LET F=X^X-N
END FUNCTION

変数Hには1/100〜1/10000程度の数値を代入しておきます。

LET H=1/100

この計算された微分式はニュートン法等で使うことができます。
変数EPSは求める精度です。

LET EPS=1E-12
INPUT PROMPT "N=": N
LET X=N
DO
LET X=X-F(X)/DIFF(X)
LOOP UNTIL ABS(X^X-N)<EPS
PRINT X,X^X
END
  │ └有難うございます。 島村1243 2008/03/21 22:18:20   ツリーへ
Re: 返事  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/21 22:18:20
有難うございます。

しばっちさん、大変良く分かりました。
微係数の求め方は中心進差分近似だけしか知らなかった
ので、しばっちさんのプログラムを動かした時にプリン
トされる沢山の式の意味が分かりませんでした。
説明を書いて頂いて、ようやくその深い意味が分かりま
した。有難うございました。
  │  └!Richardsonの補外法(extrapolation) 山中和義 2008/03/22 13:40:09   ツリーへ
Re: 有難うございます。  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/22 13:40:09
!Richardsonの補外法(extrapolation)

DEF f(x)=x*EXP(x) !関数の定義

FUNCTION N(j,h) !O(h^(2*j))の近似
IF j=1 THEN
LET N=(f(x0+h)-f(x0-h))/(2*h)
ELSE
LET N=N(j-1,h/2) + (N(j-1,h/2)-N(j-1,h))/(4^(j-1)-1) !j=2,3,…
END IF
END FUNCTION


LET x0=2
LET h=0.2

PRINT N(1,h) !N1(h)近似

PRINT N(2,h) !N2(h)近似

PRINT N(3,h) !N3(h)近似

PRINT N(4,h) !N4(h)近似

PRINT N(5,h) !N5(h)近似


PRINT
PRINT x0*EXP(x0)+EXP(x0) !検算


END
  │   └こんなに短いコードで 島村1243 2008/03/22 17:14:23   ツリーへ
Re: !Richardsonの補外法(extrapolation)  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/22 17:14:23
こんなに短いコードで

山中さん、ご教示有難うございました。
色々出てくるので無知な私は驚きの連続です。
  可変精度数値微分 しばっち 2008/03/20 21:07:22  (修正1回)  ツリーへ
Re: 数値微分式  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/20 21:07:22 ** この記事は1回修正されてます
可変精度数値微分


INPUT PROMPT "X=":X
LET H=1/1024
LET N=5 !'次数
LET M=(N+1)/2 !'中央差分
PRINT "微分値";DIFF(X,H,M,N)
PRINT "関数値";F(X)
END

EXTERNAL FUNCTION DIFF(XX,H,M,N)
DIM X(N),Y(N),A(N)
FOR I=1-M TO N-M
LET X(I+M)=XX+I*H
LET Y(I+M)=F(X(I+M))
NEXT I
FOR I=1 TO N
LET L=1
LET KK=1
FOR J=1 TO N
IF J<>I THEN
LET L=L*(X(I)-X(J))
LET A(KK)=X(J)
LET KK=KK+1
END IF
NEXT J
LET S1=0
FOR J=1 TO N-1
LET S=1
FOR K=1 TO N-1
IF K<>J THEN LET S=S*(XX-A(K))
NEXT K
LET S1=S1+S
NEXT J
LET SS=SS+S1*Y(I)/L
NEXT I
LET DIFF=SS
END FUNCTION

EXTERNAL FUNCTION F(X)
LET F=X^2
END FUNCTION
  │├F=X^2を試したら 島村1243 2008/03/22 10:23:28  (修正1回)  ツリーへ
Re: 可変精度数値微分  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/22 10:23:28 ** この記事は1回修正されてます
F=X^2を試したら

早速、可変精度数値微分のプログラムコードをBASICにコピーし
f(x)=x^2のx=3における微係数を求めてみようとして

EXTERNAL FUNCTION F(X)
LET F=X^2
END FUNCTION

と直してXの入力ダイアログに3を入力したら

X=3
微分値=9
関数値=9

と出力されてしまいました。
プログラムの使い方を誤解しているのだと思うのですが、何処が誤っているのか見当が付きません。
ご指摘頂けると有り難いです。
  ││└ご指摘ありがとうございます。こちらのミス... しばっち 2008/03/22 14:59:11   ツリーへ
Re: F=X^2を試したら  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/22 14:59:11
ご指摘ありがとうございます。こちらのミスでした。すみません。
早速検証し、修正しましたので再度コピペして使ってみて下さい。
多分これで大丈夫かと思います。何かあればご報告お願いします。
  ││ └完璧でした。 島村1243 2008/03/22 16:36:45   ツリーへ
Re: ご指摘ありがとうございます。こちらのミス...  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/22 16:36:45
完璧でした。

しばっちさん、早速のご対応有難うございました。
  │└可変精度高階数値微分 しばっち 2008/03/23 09:54:12   ツリーへ
Re: 可変精度数値微分  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/23 09:54:12
可変精度高階数値微分


LET H=1/512
INPUT PROMPT "X=":X
INPUT PROMPT "微分階数=":M
LET N=7 !'次数
LET NN=(N+1)/2 !'中央差分
!'LET NN=1 !'前進差分
!'LET NN=N !'後進差分
PRINT DIFF(X,H,NN,N,M);F(X)
END

EXTERNAL FUNCTION DIFF(XX,H,MM,NN,P)
DIM X(NN),Y(NN),A(NN),TMP(NN)
FOR I=1-MM TO NN-MM
LET X(I+MM)=XX+I*H
LET Y(I+MM)=F(X(I+MM))
NEXT I
FOR I=1 TO NN
LET KK=1
LET LL=1
FOR J=1 TO NN
IF J<>I THEN
LET LL=LL*(X(I)-X(J))
LET A(KK)=X(J)
LET KK=KK+1
END IF
NEXT J
LET SS=SS+FAC(P)*DIFFCALC(NN-1,XX,A,TMP,1,NN-1-P)*Y(I)/LL
NEXT I
LET DIFF=SS
END FUNCTION

EXTERNAL FUNCTION F(X)
LET F=X^10
END FUNCTION

EXTERNAL FUNCTION FAC(X)
LET S=1
FOR I=2 TO X
LET S=S*I
NEXT I
LET FAC=S
END FUNCTION

EXTERNAL FUNCTION DIFFCALC(N,XX,X(),T(),K,R)
IF R=0 THEN
LET S=1
FOR I=1 TO N
IF T(I)=1 THEN LET S=S*(XX-X(I))
NEXT I
LET DIFFCALC=S
ELSE
FOR I=K TO N-R+1
LET T(I)=1
LET SS=SS+DIFFCALC(N,XX,X,T,I+1,R-1)
LET T(I)=0
NEXT I
LET DIFFCALC=SS
END IF
END FUNCTION
  高階数値微分式 しばっち 2008/03/22 17:21:13   ツリーへ
Re: 数値微分式  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/22 17:21:13
高階数値微分式


OPTION BASE 0
PUBLIC NUMERIC N
LET MAXLEVEL=15
DIM X(1),Y(MAXLEVEL),L(MAXLEVEL),M(MAXLEVEL)
INPUT PROMPT "微分階数=":NN
IF MOD(NN,2)=0 THEN LET N1=1 ELSE LET N1=2
FOR N=NN+N1 TO MAXLEVEL STEP 2
LET P=INT(N/2+1) !'中央差分式
!' FOR P=1 TO N
FOR K=1 TO N
FOR I=1 TO N
LET Y(I)=0
NEXT I
LET Y(0)=1
FOR I=1 TO N
IF K<>I THEN
LET X(0)=-I
LET X(1)=1
CALL MUL(Y,X)
END IF
NEXT I
LET L(K)=HORNER(Y,K)
FOR I=1 TO NN
CALL DERIVATIVE(Y)
NEXT I
LET M(K)=HORNER(Y,P)
NEXT K
PRINT "d^";STR$(NN);"/dx^";STR$(NN);"F(X)=";
FOR I=1 TO N
LET GM=GCD(M(I),L(I))
LET M(I)=M(I)/GM
LET L(I)=L(I)/GM
NEXT I
LET LM=L(1)
FOR I=2 TO N
LET LM=LCM(LM,L(I))
NEXT I
FOR I=1 TO N
LET B=LM/L(I)
LET M(I)=M(I)*B
LET L(I)=L(I)*B
NEXT I
PRINT "(";
FOR I=1 TO N
IF M(I)*L(I)<0 THEN PRINT "-"; ELSE PRINT "+";
PRINT STR$(ABS(M(I)));"*F(X";
IF (P-I)<0 THEN PRINT "+"; ELSE PRINT "-";
PRINT STR$(ABS(P-I));"*H)";
NEXT I
PRINT ")/(";STR$(ABS(L(1)));"*H^";STR$(NN);")"
!'NEXT P
!'PRINT
NEXT N
END

EXTERNAL SUB MUL(A(),B())
OPTION BASE 0
DIM C(N)
FOR I=0 TO 1
FOR J=0 TO N-I
LET C(I+J)=C(I+J)+A(J)*B(I)
NEXT J
NEXT I
FOR I=0 TO N
LET A(I)=C(I)
NEXT I
END SUB

EXTERNAL SUB DERIVATIVE(A())
OPTION BASE 0
DIM B(N)
FOR I=N TO 1 STEP -1
LET B(I-1)=I*A(I)
NEXT I
FOR I=0 TO N
LET A(I)=B(I)
NEXT I
END SUB

EXTERNAL FUNCTION HORNER(A(),XX)
LET Y=A(N)
FOR I=N-1 TO 0 STEP -1
LET Y=Y*XX+A(I)
NEXT I
LET HORNER=Y
END FUNCTION

EXTERNAL FUNCTION GCD(M,N)
DO WHILE N<>0
LET T=MOD(M,N)
LET M=N
LET N=T
LOOP
LET GCD=M
END FUNCTION

EXTERNAL FUNCTION LCM (A, B)
LET LCM=A*B/GCD(A,B)
END FUNCTION

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。