|
AC-arctan(AC/80)*80=1是數學問題。
# S- |5 w" w7 @子子大俠既然讀過VB,那么讀VBA代碼就應該沒什么困難,核心是數值計算。
' X' X* M1 D- ?2 K. M' F# S---------------------------------------------------------------------------------------------------------------------------------------7 R6 c* K3 [# k/ j/ H$ S
定義待求解函數:# y$ D0 ]0 w c0 M
Public Function QesFun(ByVal Var_AC As Double) As Double
2 b m- c* v9 ~9 ?' e2 [! I* l8 E
QesFun = Var_AC - Atn(Var_AC / 80) * 80 - 11 ]0 V+ x- M- W. A' Q/ V7 u+ A
2 }: d5 ?% `# _' k2 T3 C
End Function
9 x1 m# G$ e. _1 Y; x* W--------------------------------------------------------------------------------------------------9 k8 \1 @$ q$ j0 K M
1. 二分法
0 r! ]5 S. a3 c* J5 G1.1 由 Arctan(AC/80)=(AC-1)/80
) _: T& S( _1 [2 ` 知 -PI()/2<(AC-1)/80< PI()/2
' {# f6 |, p) C2 F1 _, n/ T- T' @ 即 1 -80*PI()/2<AC<1+ 80*PI()/2
& T9 }7 y( T+ l# R0 a9 [! n6 D! w++++++++++++++++++++++++++++++++++++++- p, C: T0 }" {" f9 ]
1.2定義求解函數:
4 d4 M0 C. K4 P# y5 m' s# w( [Public Function SolFunDic(ByVal MaxLim As Double, ByVal MinLim As Double) As Double
0 q0 T+ S! o3 s. V( w# E2 o' P# o, W' p
Dim Res#, VarAdj#
1 R5 g9 C- M1 z! R+ Z$ D
+ C7 u8 N; k7 a, d, iVarAdj = 10 ^ -64 q( D/ I$ J7 o7 c
: A0 ]* A% k; `/ V9 K7 O
If QesFun(MinLim + VarAdj) < QesFun(MaxLim - VarAdj) Then
$ |1 Y. d1 \+ a. D8 Z
7 J' H: f8 T4 j+ k/ J Do While (1)/ A* ~- K, s9 C4 g9 |! n
- J. t2 h, G# R7 o H' J Res = (MaxLim + MinLim) / 2: F! A4 L/ ^* H7 W( Y" U
% A. x% E. w3 c m' |, n$ b4 ~ If Abs(QesFun(Res)) <= 10 ^ -12 Then& c8 d& Y# \# F
% F, e7 K* I7 a2 H5 z$ g4 h2 {0 x
SolFunDic = Res: Exit Do) X6 F( P+ f, L! b4 A) z
# `: W, f$ C% J2 C, r* _7 K$ Z
ElseIf (QesFun(Res) < 0) Then( O. Z2 k! g5 r3 F# Q% j+ w8 T
2 e$ _) d" {$ f MinLim = Res \ D2 F( N" e+ K9 K
$ Q9 e6 c& I+ T1 y" M1 r Else- l4 G7 w, S$ [8 ]
, z. T2 K! i/ y MaxLim = Res
1 u& j! v1 Q" v3 f: a" p1 i0 V$ h" _8 j
End If4 k( q, L' q% ~: p- d5 N! w0 J, S
. `" U8 Z" x- G" x, \) J
Loop
! E+ x9 J7 G ~) V+ [1 L" Y
& @( f& s9 X$ C; t/ p3 m4 SElse* Q; [' n/ l8 `7 K
. w( y' t4 X1 x% t# h% i; `, F5 } Do While (1)8 P4 ?' B) h! T" @
/ n/ [; D! S+ S: S. F Res = (MaxLim + MinLim) / 2
) u" t% F0 T/ i6 u) e% }8 _* i4 c# K' q- c1 x
If Abs(QesFun(Res)) <= 10 ^ -12 Then
9 j& P P% |$ I3 j
; i6 }$ q- f0 u5 Y. x. l7 i1 r SolFunDic = Res: Exit Do
& \& `3 X9 R+ g( d. d6 p: t7 q# t9 e. `
ElseIf (QesFun(Res) > 0) Then8 h6 p" T/ ~' V* d
! h: T, U: v3 t% j- X
MinLim = Res
( T8 O3 e% u9 {1 o0 l H: ?- e) u- n, {; n/ b4 Q/ G
Else
* ^; k9 B$ E9 y8 B) `: X* Q5 `! G' b$ Q8 U1 g% F) I
MaxLim = Res
7 I" _7 O( M- N' D! B
% S- p, _; Q* Q4 @7 I' @& Z$ A3 F End If W" c; u# t5 ]2 J' j: X
* W+ |. i, A2 a3 T ]. t) \' e7 ]
Loop
' U8 A$ z I& u# v- N5 o! u
: r. V9 P/ l4 R- }/ o( lEnd If- Q3 @* x" e& I" @$ W7 f) k1 w+ f" [
End Function
$ U0 m2 w' _* l+ Z( i--------------------------------------------------------------
, E4 h: N: `; x% E& I" i; F2. 牛頓法, e7 ~1 U& J3 u& C6 P0 R) O) B
2.1 由 f(AC)=arctan(AC/80)*80+1-AC
/ s8 [# n: Z7 Z 求導 f(AC)’=1/(1+(AC/80)^2)-1
% r* M1 E9 e( F: V 即 AC_1=AC_0- f(AC)/ f(AC)’
. |7 G+ P- x+ H0 \9 l" O--------------------------------------------------------------
9 ?9 p$ }: x! ]* N0 n7 Q# z2.2定義迭代函數:
" F5 F$ l. S* B$ KPublic Function QesFunNew(ByVal Var_AC As Double) As Double
1 X& _$ @% Q. ?6 q, ?6 o; i1 g' m7 F: N
QesFunNew = Var_AC - (Atn(Var_AC / 80) * 80 + 1 - Var_AC) / (1 / (1 + (Var_AC / 80) ^ 2) - 1)
4 H5 P5 k8 y# E" R1 @& A$ n
' {, [) Q5 _2 B# ?End Function
$ Q0 m P2 I' b/ l$ d$ W---------------------------------------------------------------
/ |: H% n" O) `6 _, ?1 i" C2.3定義求解函數
" w2 D: E2 j/ W7 ?- c& LPublic Function SolFunNew(ByVal IniAC As Double) As Double! e' Y9 h, e4 a) P) b( R# T
* X5 T* U$ j6 A
Dim Res#/ d* [( W) ]1 w- B
/ k- O2 U) [; C: p5 Z% YDo While (1)5 n3 q' X e9 Z2 ?2 |+ B
4 x# k9 E7 @, w7 t Res = QesFunNew(IniAC)( N' x& [& `" D) S
/ F- h. X: x. D7 i/ J/ q3 U
If Abs(QesFun(Res)) <= 10 ^ -12 Then" K8 e9 N z, m" y
5 _7 l6 f+ D5 h' q8 H) N9 G! a" h SolFunNew = Res: Exit Do
z; ]! j6 h: }8 `% k$ O 5 B9 ~+ D8 b4 |( w( H$ m. |) V: ^8 }7 r
Else' o1 @; n% {% j) f& Q( T
5 H, Z8 Z- y( P* v1 h" P
IniAC = Res
+ @0 O; N1 U1 q$ t+ y* A- N+ I; F$ T " N3 X9 ^* h9 N- N/ n3 l% _
End If
+ f- I- j( t1 g9 ~
7 T8 [( ^: O0 E. C) jLoop9 j# F4 n2 I% @& b, x" v* u
----------------------------------------------------------------------------------------------------------
4 k. C! a, n6 Y: A. j$ ~" k
6 {4 I% z* n7 O這樣做可能有點麻煩,但涉及到循環,迭代時,可自由調用自定義VBA函數和工作表函數(矩陣計算連桿機構),還可控制輸出表格,便于插圖。計算冷卻塔時,積分得用辛普遜;解汽水比,得解非線性方程。對這些問題,EXCEL 工作表自身好像很吃力。0 A; c0 u) H+ s- R/ t5 C. Q/ k
. d9 [! v2 n" G3 [/ n! U9 w |
評分
-
查看全部評分
|