1

我正在寻找一种方法来定义一个模式,现在不能完全评估定义。

两个并发症:我不能简单地使用:=代替(我可以吗?),因为需要评估=论证中的某些部分。我也没有成功(使用 extract-replace-trick 来评估我的论点),因为这将永远存在 - 问题是我的模式也在使用另一个技巧,因此实际上并不总是返回包含的表达式(从来没有当明确地写下我的模式,只有当其他一些函数将数字放入其中时),所以我没有找到保持并消失。 HoldHoldHoldReleaseHold

我认为只持有一次并且不会把头放在那里的东西Hold会救我。否则,一个ReleaseHold不会消失但放置一个保持在那里的反Hold-head也可以工作,但不是那么好。

所以这是我的代码,它只是试图为 n 个参数求解 n 个方程,但 eqns 包含数值积分:

Do[
    (*make an array eq[k] of patterns that do nothing 
      if they dont get specific numbers in a list ak_ and otherwise do NIntegrate *) 
 eq[k] [ak_?  (Function[list, And @@ NumericQ /@ list]) ] = 
  (
   ReplacePart[#1, #2 -> Extract[#1, #2]] & [
         (*NIntegrate needs to be Holded, but the Do-loop-k must be plugged in inside
           its argument, so extract it and put it back*)                            
    Hold[ NIntegrate[complicated functions for each k with appearance of ak[[k]]), {t, 0, l}, 
      MaxRecursion -> 50] ]
                                      ,  { 1, 1}    
     ]
   )
 , {k, n}] 

(*test*)
ReleaseHold[eq[3][{2,4,3,5,2}]] (*gives a number, great! (n=5 here) *)

eqns = Table[ReleaseHold[eq[i][ Table[a[j], {j, n}]]], {i, n}]  (*does not give an error since pattern is not evaluated, great!*)

vars = Table[{a[i],0},{i,n}]
FindRoot[eqns,vars]
         (*does not work since there is still 
          the Hold appearing now, ReleaseHold above was useless 
          since pattern was not evaluated and Hold not appearing*) 
4

0 回答 0