我有一段未記錄的代碼,我必須了解這些代碼才能修復(fù)錯(cuò)誤。下面的方法被調(diào)用optimization,它應(yīng)該找到一個(gè)非常復(fù)雜的函數(shù)的最大值f。不幸的是,它在某些情況下會(huì)失敗(即達(dá)到“達(dá)到最大迭代次數(shù)”行)。我已經(jīng)嘗試編寫(xiě)一些單元測(cè)試,但這并沒(méi)有多大幫助。所以我想了解這個(gè)方法是如何真正工作的,以及它是否實(shí)現(xiàn)了一個(gè)特定的、眾所周知的優(yōu)化算法。也許我可以理解,如果它適合解決所需的方程。public static double optimization(double x1, double x2, double x3, Function<Double, Double> f, double epsilon) { double y1 = f.apply(x1); double y2 = f.apply(x2); double y3 = f.apply(x3); double a = ( x1*(y2-y3)+ x2*(y3-y1)+ x3*(y1-y2)) / ((x1-x2)*(x1-x3)*(x3-x2)); double b = (x1*x1*(y2-y3)+x2*x2*(y3-y1)+x3*x3*(y1-y2)) / ((x1-x2)*(x1-x3)*(x2-x3)); int i=0; do { i=i+1; x3=x2; x2=x1; x1=-1.*b/(2*a); y1=f.apply(x1); y2=f.apply(x2); y3=f.apply(x3); a = ( x1*(y2-y3)+ x2*(y3-y1)+ x3*(y1-y2))/((x1-x2)*(x1-x3)*(x3-x2)); b = (x1*x1*(y2-y3)+x2*x2*(y3-y1)+x3*x3*(y1-y2))/((x1-x2)*(x1-x3)*(x2-x3)); } while((Math.abs(x1 - x2) > epsilon) && (i<1000)); if (i==1000){ Log.debug("Max iteration reached"); } return x1;}
1 回答

30秒到達(dá)戰(zhàn)場(chǎng)
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
這似乎是一個(gè)連續(xù)拋物線插值。
線索之一是用極值的位置替換三個(gè)估計(jì)中最舊的,
x3= x2; x2= x1; x1= -1. * b / (2 * a);
如果估計(jì)沒(méi)有達(dá)到極值配置(特別是在拐點(diǎn)處),則該方法可能會(huì)失敗。
添加回答
舉報(bào)
0/150
提交
取消