@@ -186,6 +186,7 @@ package symjava.examples;
186186import Jama.Matrix ;
187187import symjava.matrix.* ;
188188import symjava.relational.Eq ;
189+ import symjava.symbolic.Expr ;
189190
190191/**
191192 * A general Gauss Newton solver using SymJava for simbolic computations
@@ -200,17 +201,20 @@ public class GaussNewton {
200201 SymVector res = new SymVector (n);
201202 SymMatrix J = new SymMatrix (n, eq. getParams(). length);
202203
204+ Expr [] params = eq. getParams();
203205 for (int i= 0 ; i< n; i++ ) {
204206 Eq subEq = eq. subsUnknowns(data[i]);
205207 res[i] = subEq. lhs - subEq. rhs; // res[i] =y[i] - a*x[i]/(b + x[i]);
206- for (int j= 0 ; j< eq. getParams(). length; j++ )
207- J [i][j] = res[i]. diff(eq. getParams()[j]);
208+ for (int j= 0 ; j< eq. getParams(). length; j++ ) {
209+ Expr df = res[i]. diff(params[j]);
210+ J [i][j] = df;
211+ }
208212 }
209213
210214 System . out. println(" Jacobian Matrix = " );
211- J . print( );
215+ System . out . println( J );
212216 System . out. println(" Residuals = " );
213- res . print( );
217+ System . out . println(res );
214218
215219 // Convert symbolic staff to Bytecode staff to speedup evaluation
216220 NumVector Nres = new NumVector (res, eq. getParams());
@@ -233,7 +237,6 @@ public class GaussNewton {
233237 }
234238 }
235239}
236-
237240```
238241
239242``` Java
@@ -308,46 +311,58 @@ x=35.60000
308311x=26.39551
309312x=24.79064
310313x=24.73869
311- L(y_0,y_1,y_2,y_3,y_4,y_5,y_6,\lambda_0,\lambda_1,\lambda_2,\lambda_3,\lambda_4,\lambda_5,\lambda_6,a,b)=
312- (0.05 - y_0)^2 + (0.094 - y_2)^2 + (0.127 - y_1)^2 + (0.2122 - y_3)^2 + (0.2665 - y_5)^2 + (0.2729 - y_4)^2 + (0.3317 - y_6)^2 + \lambda_0*y_0 + \lambda_1*y_1 + \lambda_2*y_2 + \lambda_3*y_3 + \lambda_4*y_4 + \lambda_5*y_5 - 3.74*\lambda_6*a/(b + 3.74) + 0.038*\lambda_0*a/(b + 0.038) + 0.194*\lambda_1*a/(b + 0.194) + 0.425*\lambda_2*a/(b + 0.425) + 0.626*\lambda_3*a/(b + 0.626) + 1.253*\lambda_4*a/(b + 1.253) + 2.5*\lambda_5*a/(b + 2.5) + \lambda_6*y_6
313- Hessian Matrix =
314- 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
315- 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0
316- 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0
317- 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0
318- 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0
319- 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0
320- 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0
321- 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.038/(b + 0.038) 0.038*a*(b + 0.038)^-2
322- 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -0.194/(b + 0.194) 0.194*a*(b + 0.194)^-2
323- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 -0.425/(b + 0.425) 0.425*a*(b + 0.425)^-2
324- 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -0.626/(b + 0.626) 0.626*a*(b + 0.626)^-2
325- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1.253/(b + 1.253) 1.253*a*(b + 1.253)^-2
326- 0 0 0 0 0 1 0 0 0 0 0 0 0 0 -2.5/(b + 2.5) 2.5*a*(b + 2.5)^-2
327- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -3.74/(b + 3.74) 3.74*a*(b + 3.74)^-2
328- 0 0 0 0 0 0 0 -0.038/(b + 0.038) -0.194/(b + 0.194) -0.425/(b + 0.425) -0.626/(b + 0.626) -1.253/(b + 1.253) -2.5/(b + 2.5) -3.74/(b + 3.74) 0 3.74*\lambda_6*(b + 3.74)^-2 + 0.038*\lambda_0*(b + 0.038)^-2 + 0.194*\lambda_1*(b + 0.194)^-2 + 0.425*\lambda_2*(b + 0.425)^-2 + 0.626*\lambda_3*(b + 0.626)^-2 + 1.253*\lambda_4*(b + 1.253)^-2 + 2.5*\lambda_5*(b + 2.5)^-2
329- 0 0 0 0 0 0 0 0.038*a*(b + 0.038)^-2 0.194*a*(b + 0.194)^-2 0.425*a*(b + 0.425)^-2 0.626*a*(b + 0.626)^-2 1.253*a*(b + 1.253)^-2 2.5*a*(b + 2.5)^-2 3.74*a*(b + 3.74)^-2 0.038*\lambda_0*(b + 0.038)^-2 + 0.194*\lambda_1*(b + 0.194)^-2 + 0.425*\lambda_2*(b + 0.425)^-2 + 0.626*\lambda_3*(b + 0.626)^-2 + 1.253*\lambda_4*(b + 1.253)^-2 + 2.5*\lambda_5*(b + 2.5)^-2 + 3.74*\lambda_6*(b + 3.74)^-2 -0.076*\lambda_0*a*(b + 0.038)^-3 + -0.388*\lambda_1*a*(b + 0.194)^-3 + -0.85*\lambda_2*a*(b + 0.425)^-3 + -1.252*\lambda_3*a*(b + 0.626)^-3 + -2.506*\lambda_4*a*(b + 1.253)^-3 + -5.0*\lambda_5*a*(b + 2.5)^-3 + -7.48*\lambda_6*a*(b + 3.74)^-3
330- Grident =
331- -0.1 + \lambda_0 + 2*y_0
332- -0.254 + \lambda_1 + 2*y_1
333- -0.188 + \lambda_2 + 2*y_2
334- -0.4244 + \lambda_3 + 2*y_3
335- -0.5458 + \lambda_4 + 2*y_4
336- -0.533 + \lambda_5 + 2*y_5
337- -0.6634 + \lambda_6 + 2*y_6
338- -0.038*a/(b + 0.038) + y_0
339- -0.194*a/(b + 0.194) + y_1
340- -0.425*a/(b + 0.425) + y_2
341- -0.626*a/(b + 0.626) + y_3
342- -1.253*a/(b + 1.253) + y_4
343- -2.5*a/(b + 2.5) + y_5
344- -3.74*a/(b + 3.74) + y_6
345- -(3.74*\lambda_6/(b + 3.74) + 0.038*\lambda_0/(b + 0.038) + 0.194*\lambda_1/(b + 0.194) + 0.425*\lambda_2/(b + 0.425) + 0.626*\lambda_3/(b + 0.626) + 1.253*\lambda_4/(b + 1.253) + 2.5*\lambda_5/(b + 2.5))
346- 0.038*\lambda_0*a*(b + 0.038)^-2 + 0.194*\lambda_1*a*(b + 0.194)^-2 + 0.425*\lambda_2*a*(b + 0.425)^-2 + 0.626*\lambda_3*a*(b + 0.626)^-2 + 1.253*\lambda_4*a*(b + 1.253)^-2 + 2.5*\lambda_5*a*(b + 2.5)^-2 + 3.74*\lambda_6*a*(b + 3.74)^-2
347- Iterativly sovle ...
348- y_0=0.00000 y_1=0.00000 y_2=0.00000 y_3=0.00000 y_4=0.00000 y_5=0.00000 y_6=0.00000 \lambda_0=0.00000 \lambda_1=0.00000 \lambda_2=0.00000 \lambda_3=0.00000 \lambda_4=0.00000 \lambda_5=0.00000 \lambda_6=0.00000 a=0.90000 b=0.20000
349- y_0=0.01678 y_1=0.09612 y_2=0.16729 y_3=0.20243 y_4=0.25473 y_5=0.28945 y_6=0.30273 \lambda_0=0.06643 \lambda_1=0.06176 \lambda_2=-0.14658 \lambda_3=0.01955 \lambda_4=0.03634 \lambda_5=-0.04590 \lambda_6=0.05794 a=0.33266 b=0.26017
350- y_0=0.01624 y_1=0.08735 y_2=0.15765 y_3=0.19518 y_4=0.25469 y_5=0.29667 y_6=0.31327 \lambda_0=0.06752 \lambda_1=0.07930 \lambda_2=-0.12729 \lambda_3=0.03404 \lambda_4=0.03642 \lambda_5=-0.06034 \lambda_6=0.03687 a=0.35178 b=0.46125
351- y_0=0.02256 y_1=0.09240 y_2=0.15593 y_3=0.19116 y_4=0.25076 y_5=0.29644 y_6=0.31550 \lambda_0=0.05487 \lambda_1=0.06919 \lambda_2=-0.12387 \lambda_3=0.04207 \lambda_4=0.04428 \lambda_5=-0.05989 \lambda_6=0.03240 a=0.36223 b=0.55462
352- y_0=0.02314 y_1=0.09356 y_2=0.15671 y_3=0.19159 y_4=0.25059 y_5=0.29598 y_6=0.31499 \lambda_0=0.05373 \lambda_1=0.06689 \lambda_2=-0.12542 \lambda_3=0.04123 \lambda_4=0.04463 \lambda_5=-0.05896 \lambda_6=0.03342 a=0.36185 b=0.55631
353314```
315+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex3_L.png )
316+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex3_hessian.png )
317+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex3_grad.png )
318+
319+ ``` Java
320+ package symjava.examples ;
321+
322+ import static symjava.symbolic.Symbol.* ;
323+ import symjava.matrix.* ;
324+ import symjava.symbolic.* ;
325+
326+ /**
327+ * Example for PDE Constrained Parameters Optimization
328+ *
329+ */
330+ public class Example4 {
331+ public static void main (String [] args ) {
332+ Func u = new Func (" u" , x,y,z);
333+ Func u0 = new Func (" u0" , x,y,z);
334+ Func q = new Func (" q" , x,y,z);
335+ Func q0 = new Func (" q0" , x,y,z);
336+ Func f = new Func (" f" , x,y,z);
337+ Func lamd = new Func (" \\ lambda " , x,y,z);
338+
339+ Expr reg_term = (q- q0)* (q- q0)* 0.5 * 0.1 ;
340+
341+ Func L = new Func (" L" ,(u- u0)* (u- u0)/ 2 + reg_term + q* Dot . apply(Grad . apply(u), Grad . apply(lamd)) - f* lamd);
342+ System . out. println(" Lagrange L(u, \\ lambda, q) = \n " + L );
343+
344+ Func phi = new Func (" \\ phi " , x,y,z);
345+ Func psi = new Func (" \\ psi " , x,y,z);
346+ Func chi = new Func (" \\ chi " , x,y,z);
347+ Expr [] xs = new Expr []{u, lamd, q };
348+ Expr [] dxs = new Expr []{phi, psi, chi };
349+ SymVector Lx = Grad . apply(L , xs, dxs);
350+ System . out. println(" \n Gradient Lx = (Lu, Llamd, Lq) =" );
351+ System . out. println(Lx );
352+
353+ Func du = new Func (" \\ delta{u}" , x,y,z);
354+ Func dl = new Func (" \\ delta{\\ lambda}" , x,y,z);
355+ Func dq = new Func (" \\ delta{q}" , x,y,z);
356+ Expr [] dxs2 = new Expr [] { du, dl, dq };
357+ SymMatrix Lxx = new SymMatrix ();
358+ for (Expr Lxi : Lx ) {
359+ Lxx . add(Grad . apply(Lxi , xs, dxs2));
360+ }
361+ System . out. println(" \n Hessian Matrix =" );
362+ System . out. println(Lxx );
363+ }
364+ }
365+ ```
366+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex4_L.png )
367+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex4_hessian.png )
368+ ![ ] ( https://github.com/yuemingl/SymJava/blob/master/images/ex4_grad.png )
0 commit comments