comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.ode.jacobians;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.io.IOException;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import java.io.ObjectInput;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import java.io.ObjectOutput;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import java.lang.reflect.Array;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import java.util.ArrayList;<a name="line.24"></a>
28 <FONT color="green">025</FONT> import java.util.Collection;<a name="line.25"></a>
29 <FONT color="green">026</FONT> <a name="line.26"></a>
30 <FONT color="green">027</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.27"></a>
31 <FONT color="green">028</FONT> import org.apache.commons.math.MaxEvaluationsExceededException;<a name="line.28"></a>
32 <FONT color="green">029</FONT> import org.apache.commons.math.ode.DerivativeException;<a name="line.29"></a>
33 <FONT color="green">030</FONT> import org.apache.commons.math.ode.FirstOrderDifferentialEquations;<a name="line.30"></a>
34 <FONT color="green">031</FONT> import org.apache.commons.math.ode.FirstOrderIntegrator;<a name="line.31"></a>
35 <FONT color="green">032</FONT> import org.apache.commons.math.ode.IntegratorException;<a name="line.32"></a>
36 <FONT color="green">033</FONT> import org.apache.commons.math.ode.events.EventException;<a name="line.33"></a>
37 <FONT color="green">034</FONT> import org.apache.commons.math.ode.events.EventHandler;<a name="line.34"></a>
38 <FONT color="green">035</FONT> import org.apache.commons.math.ode.sampling.StepHandler;<a name="line.35"></a>
39 <FONT color="green">036</FONT> import org.apache.commons.math.ode.sampling.StepInterpolator;<a name="line.36"></a>
40 <FONT color="green">037</FONT> <a name="line.37"></a>
41 <FONT color="green">038</FONT> /** This class enhances a first order integrator for differential equations to<a name="line.38"></a>
42 <FONT color="green">039</FONT> * compute also partial derivatives of the solution with respect to initial state<a name="line.39"></a>
43 <FONT color="green">040</FONT> * and parameters.<a name="line.40"></a>
44 <FONT color="green">041</FONT> * &lt;p&gt;In order to compute both the state and its derivatives, the ODE problem<a name="line.41"></a>
45 <FONT color="green">042</FONT> * is extended with jacobians of the raw ODE and the variational equations are<a name="line.42"></a>
46 <FONT color="green">043</FONT> * added to form a new compound problem of higher dimension. If the original ODE<a name="line.43"></a>
47 <FONT color="green">044</FONT> * problem has dimension n and there are p parameters, the compound problem will<a name="line.44"></a>
48 <FONT color="green">045</FONT> * have dimension n &amp;times; (1 + n + p).&lt;/p&gt;<a name="line.45"></a>
49 <FONT color="green">046</FONT> * @see ParameterizedODE<a name="line.46"></a>
50 <FONT color="green">047</FONT> * @see ODEWithJacobians<a name="line.47"></a>
51 <FONT color="green">048</FONT> * @version $Revision: 927342 $ $Date: 2010-03-25 06:55:55 -0400 (Thu, 25 Mar 2010) $<a name="line.48"></a>
52 <FONT color="green">049</FONT> * @since 2.1<a name="line.49"></a>
53 <FONT color="green">050</FONT> */<a name="line.50"></a>
54 <FONT color="green">051</FONT> public class FirstOrderIntegratorWithJacobians {<a name="line.51"></a>
55 <FONT color="green">052</FONT> <a name="line.52"></a>
56 <FONT color="green">053</FONT> /** Underlying integrator for compound problem. */<a name="line.53"></a>
57 <FONT color="green">054</FONT> private final FirstOrderIntegrator integrator;<a name="line.54"></a>
58 <FONT color="green">055</FONT> <a name="line.55"></a>
59 <FONT color="green">056</FONT> /** Raw equations to integrate. */<a name="line.56"></a>
60 <FONT color="green">057</FONT> private final ODEWithJacobians ode;<a name="line.57"></a>
61 <FONT color="green">058</FONT> <a name="line.58"></a>
62 <FONT color="green">059</FONT> /** Maximal number of evaluations allowed. */<a name="line.59"></a>
63 <FONT color="green">060</FONT> private int maxEvaluations;<a name="line.60"></a>
64 <FONT color="green">061</FONT> <a name="line.61"></a>
65 <FONT color="green">062</FONT> /** Number of evaluations already performed. */<a name="line.62"></a>
66 <FONT color="green">063</FONT> private int evaluations;<a name="line.63"></a>
67 <FONT color="green">064</FONT> <a name="line.64"></a>
68 <FONT color="green">065</FONT> /** Build an enhanced integrator using internal differentiation to compute jacobians.<a name="line.65"></a>
69 <FONT color="green">066</FONT> * @param integrator underlying integrator to solve the compound problem<a name="line.66"></a>
70 <FONT color="green">067</FONT> * @param ode original problem (f in the equation y' = f(t, y))<a name="line.67"></a>
71 <FONT color="green">068</FONT> * @param p parameters array (may be null if {@link<a name="line.68"></a>
72 <FONT color="green">069</FONT> * ParameterizedODE#getParametersDimension()<a name="line.69"></a>
73 <FONT color="green">070</FONT> * getParametersDimension()} from original problem is zero)<a name="line.70"></a>
74 <FONT color="green">071</FONT> * @param hY step sizes to use for computing the jacobian df/dy, must have the<a name="line.71"></a>
75 <FONT color="green">072</FONT> * same dimension as the original problem<a name="line.72"></a>
76 <FONT color="green">073</FONT> * @param hP step sizes to use for computing the jacobian df/dp, must have the<a name="line.73"></a>
77 <FONT color="green">074</FONT> * same dimension as the original problem parameters dimension<a name="line.74"></a>
78 <FONT color="green">075</FONT> * @see #FirstOrderIntegratorWithJacobians(FirstOrderIntegrator,<a name="line.75"></a>
79 <FONT color="green">076</FONT> * ODEWithJacobians)<a name="line.76"></a>
80 <FONT color="green">077</FONT> */<a name="line.77"></a>
81 <FONT color="green">078</FONT> public FirstOrderIntegratorWithJacobians(final FirstOrderIntegrator integrator,<a name="line.78"></a>
82 <FONT color="green">079</FONT> final ParameterizedODE ode,<a name="line.79"></a>
83 <FONT color="green">080</FONT> final double[] p, final double[] hY, final double[] hP) {<a name="line.80"></a>
84 <FONT color="green">081</FONT> checkDimension(ode.getDimension(), hY);<a name="line.81"></a>
85 <FONT color="green">082</FONT> checkDimension(ode.getParametersDimension(), p);<a name="line.82"></a>
86 <FONT color="green">083</FONT> checkDimension(ode.getParametersDimension(), hP);<a name="line.83"></a>
87 <FONT color="green">084</FONT> this.integrator = integrator;<a name="line.84"></a>
88 <FONT color="green">085</FONT> this.ode = new FiniteDifferencesWrapper(ode, p, hY, hP);<a name="line.85"></a>
89 <FONT color="green">086</FONT> setMaxEvaluations(-1);<a name="line.86"></a>
90 <FONT color="green">087</FONT> }<a name="line.87"></a>
91 <FONT color="green">088</FONT> <a name="line.88"></a>
92 <FONT color="green">089</FONT> /** Build an enhanced integrator using ODE builtin jacobian computation features.<a name="line.89"></a>
93 <FONT color="green">090</FONT> * @param integrator underlying integrator to solve the compound problem<a name="line.90"></a>
94 <FONT color="green">091</FONT> * @param ode original problem, which can compute the jacobians by itself<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @see #FirstOrderIntegratorWithJacobians(FirstOrderIntegrator,<a name="line.92"></a>
96 <FONT color="green">093</FONT> * ParameterizedODE, double[], double[], double[])<a name="line.93"></a>
97 <FONT color="green">094</FONT> */<a name="line.94"></a>
98 <FONT color="green">095</FONT> public FirstOrderIntegratorWithJacobians(final FirstOrderIntegrator integrator,<a name="line.95"></a>
99 <FONT color="green">096</FONT> final ODEWithJacobians ode) {<a name="line.96"></a>
100 <FONT color="green">097</FONT> this.integrator = integrator;<a name="line.97"></a>
101 <FONT color="green">098</FONT> this.ode = ode;<a name="line.98"></a>
102 <FONT color="green">099</FONT> setMaxEvaluations(-1);<a name="line.99"></a>
103 <FONT color="green">100</FONT> }<a name="line.100"></a>
104 <FONT color="green">101</FONT> <a name="line.101"></a>
105 <FONT color="green">102</FONT> /** Add a step handler to this integrator.<a name="line.102"></a>
106 <FONT color="green">103</FONT> * &lt;p&gt;The handler will be called by the integrator for each accepted<a name="line.103"></a>
107 <FONT color="green">104</FONT> * step.&lt;/p&gt;<a name="line.104"></a>
108 <FONT color="green">105</FONT> * @param handler handler for the accepted steps<a name="line.105"></a>
109 <FONT color="green">106</FONT> * @see #getStepHandlers()<a name="line.106"></a>
110 <FONT color="green">107</FONT> * @see #clearStepHandlers()<a name="line.107"></a>
111 <FONT color="green">108</FONT> */<a name="line.108"></a>
112 <FONT color="green">109</FONT> public void addStepHandler(StepHandlerWithJacobians handler) {<a name="line.109"></a>
113 <FONT color="green">110</FONT> final int n = ode.getDimension();<a name="line.110"></a>
114 <FONT color="green">111</FONT> final int k = ode.getParametersDimension();<a name="line.111"></a>
115 <FONT color="green">112</FONT> integrator.addStepHandler(new StepHandlerWrapper(handler, n, k));<a name="line.112"></a>
116 <FONT color="green">113</FONT> }<a name="line.113"></a>
117 <FONT color="green">114</FONT> <a name="line.114"></a>
118 <FONT color="green">115</FONT> /** Get all the step handlers that have been added to the integrator.<a name="line.115"></a>
119 <FONT color="green">116</FONT> * @return an unmodifiable collection of the added events handlers<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @see #addStepHandler(StepHandlerWithJacobians)<a name="line.117"></a>
121 <FONT color="green">118</FONT> * @see #clearStepHandlers()<a name="line.118"></a>
122 <FONT color="green">119</FONT> */<a name="line.119"></a>
123 <FONT color="green">120</FONT> public Collection&lt;StepHandlerWithJacobians&gt; getStepHandlers() {<a name="line.120"></a>
124 <FONT color="green">121</FONT> final Collection&lt;StepHandlerWithJacobians&gt; handlers =<a name="line.121"></a>
125 <FONT color="green">122</FONT> new ArrayList&lt;StepHandlerWithJacobians&gt;();<a name="line.122"></a>
126 <FONT color="green">123</FONT> for (final StepHandler handler : integrator.getStepHandlers()) {<a name="line.123"></a>
127 <FONT color="green">124</FONT> if (handler instanceof StepHandlerWrapper) {<a name="line.124"></a>
128 <FONT color="green">125</FONT> handlers.add(((StepHandlerWrapper) handler).getHandler());<a name="line.125"></a>
129 <FONT color="green">126</FONT> }<a name="line.126"></a>
130 <FONT color="green">127</FONT> }<a name="line.127"></a>
131 <FONT color="green">128</FONT> return handlers;<a name="line.128"></a>
132 <FONT color="green">129</FONT> }<a name="line.129"></a>
133 <FONT color="green">130</FONT> <a name="line.130"></a>
134 <FONT color="green">131</FONT> /** Remove all the step handlers that have been added to the integrator.<a name="line.131"></a>
135 <FONT color="green">132</FONT> * @see #addStepHandler(StepHandlerWithJacobians)<a name="line.132"></a>
136 <FONT color="green">133</FONT> * @see #getStepHandlers()<a name="line.133"></a>
137 <FONT color="green">134</FONT> */<a name="line.134"></a>
138 <FONT color="green">135</FONT> public void clearStepHandlers() {<a name="line.135"></a>
139 <FONT color="green">136</FONT> integrator.clearStepHandlers();<a name="line.136"></a>
140 <FONT color="green">137</FONT> }<a name="line.137"></a>
141 <FONT color="green">138</FONT> <a name="line.138"></a>
142 <FONT color="green">139</FONT> /** Add an event handler to the integrator.<a name="line.139"></a>
143 <FONT color="green">140</FONT> * @param handler event handler<a name="line.140"></a>
144 <FONT color="green">141</FONT> * @param maxCheckInterval maximal time interval between switching<a name="line.141"></a>
145 <FONT color="green">142</FONT> * function checks (this interval prevents missing sign changes in<a name="line.142"></a>
146 <FONT color="green">143</FONT> * case the integration steps becomes very large)<a name="line.143"></a>
147 <FONT color="green">144</FONT> * @param convergence convergence threshold in the event time search<a name="line.144"></a>
148 <FONT color="green">145</FONT> * @param maxIterationCount upper limit of the iteration count in<a name="line.145"></a>
149 <FONT color="green">146</FONT> * the event time search<a name="line.146"></a>
150 <FONT color="green">147</FONT> * @see #getEventHandlers()<a name="line.147"></a>
151 <FONT color="green">148</FONT> * @see #clearEventHandlers()<a name="line.148"></a>
152 <FONT color="green">149</FONT> */<a name="line.149"></a>
153 <FONT color="green">150</FONT> public void addEventHandler(EventHandlerWithJacobians handler,<a name="line.150"></a>
154 <FONT color="green">151</FONT> double maxCheckInterval,<a name="line.151"></a>
155 <FONT color="green">152</FONT> double convergence,<a name="line.152"></a>
156 <FONT color="green">153</FONT> int maxIterationCount) {<a name="line.153"></a>
157 <FONT color="green">154</FONT> final int n = ode.getDimension();<a name="line.154"></a>
158 <FONT color="green">155</FONT> final int k = ode.getParametersDimension();<a name="line.155"></a>
159 <FONT color="green">156</FONT> integrator.addEventHandler(new EventHandlerWrapper(handler, n, k),<a name="line.156"></a>
160 <FONT color="green">157</FONT> maxCheckInterval, convergence, maxIterationCount);<a name="line.157"></a>
161 <FONT color="green">158</FONT> }<a name="line.158"></a>
162 <FONT color="green">159</FONT> <a name="line.159"></a>
163 <FONT color="green">160</FONT> /** Get all the event handlers that have been added to the integrator.<a name="line.160"></a>
164 <FONT color="green">161</FONT> * @return an unmodifiable collection of the added events handlers<a name="line.161"></a>
165 <FONT color="green">162</FONT> * @see #addEventHandler(EventHandlerWithJacobians, double, double, int)<a name="line.162"></a>
166 <FONT color="green">163</FONT> * @see #clearEventHandlers()<a name="line.163"></a>
167 <FONT color="green">164</FONT> */<a name="line.164"></a>
168 <FONT color="green">165</FONT> public Collection&lt;EventHandlerWithJacobians&gt; getEventHandlers() {<a name="line.165"></a>
169 <FONT color="green">166</FONT> final Collection&lt;EventHandlerWithJacobians&gt; handlers =<a name="line.166"></a>
170 <FONT color="green">167</FONT> new ArrayList&lt;EventHandlerWithJacobians&gt;();<a name="line.167"></a>
171 <FONT color="green">168</FONT> for (final EventHandler handler : integrator.getEventHandlers()) {<a name="line.168"></a>
172 <FONT color="green">169</FONT> if (handler instanceof EventHandlerWrapper) {<a name="line.169"></a>
173 <FONT color="green">170</FONT> handlers.add(((EventHandlerWrapper) handler).getHandler());<a name="line.170"></a>
174 <FONT color="green">171</FONT> }<a name="line.171"></a>
175 <FONT color="green">172</FONT> }<a name="line.172"></a>
176 <FONT color="green">173</FONT> return handlers;<a name="line.173"></a>
177 <FONT color="green">174</FONT> }<a name="line.174"></a>
178 <FONT color="green">175</FONT> <a name="line.175"></a>
179 <FONT color="green">176</FONT> /** Remove all the event handlers that have been added to the integrator.<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @see #addEventHandler(EventHandlerWithJacobians, double, double, int)<a name="line.177"></a>
181 <FONT color="green">178</FONT> * @see #getEventHandlers()<a name="line.178"></a>
182 <FONT color="green">179</FONT> */<a name="line.179"></a>
183 <FONT color="green">180</FONT> public void clearEventHandlers() {<a name="line.180"></a>
184 <FONT color="green">181</FONT> integrator.clearEventHandlers();<a name="line.181"></a>
185 <FONT color="green">182</FONT> }<a name="line.182"></a>
186 <FONT color="green">183</FONT> <a name="line.183"></a>
187 <FONT color="green">184</FONT> /** Integrate the differential equations and the variational equations up to the given time.<a name="line.184"></a>
188 <FONT color="green">185</FONT> * &lt;p&gt;This method solves an Initial Value Problem (IVP) and also computes the derivatives<a name="line.185"></a>
189 <FONT color="green">186</FONT> * of the solution with respect to initial state and parameters. This can be used as<a name="line.186"></a>
190 <FONT color="green">187</FONT> * a basis to solve Boundary Value Problems (BVP).&lt;/p&gt;<a name="line.187"></a>
191 <FONT color="green">188</FONT> * &lt;p&gt;Since this method stores some internal state variables made<a name="line.188"></a>
192 <FONT color="green">189</FONT> * available in its public interface during integration ({@link<a name="line.189"></a>
193 <FONT color="green">190</FONT> * #getCurrentSignedStepsize()}), it is &lt;em&gt;not&lt;/em&gt; thread-safe.&lt;/p&gt;<a name="line.190"></a>
194 <FONT color="green">191</FONT> * @param t0 initial time<a name="line.191"></a>
195 <FONT color="green">192</FONT> * @param y0 initial value of the state vector at t0<a name="line.192"></a>
196 <FONT color="green">193</FONT> * @param dY0dP initial value of the state vector derivative with respect to the<a name="line.193"></a>
197 <FONT color="green">194</FONT> * parameters at t0<a name="line.194"></a>
198 <FONT color="green">195</FONT> * @param t target time for the integration<a name="line.195"></a>
199 <FONT color="green">196</FONT> * (can be set to a value smaller than &lt;code&gt;t0&lt;/code&gt; for backward integration)<a name="line.196"></a>
200 <FONT color="green">197</FONT> * @param y placeholder where to put the state vector at each successful<a name="line.197"></a>
201 <FONT color="green">198</FONT> * step (and hence at the end of integration), can be the same object as y0<a name="line.198"></a>
202 <FONT color="green">199</FONT> * @param dYdY0 placeholder where to put the state vector derivative with respect<a name="line.199"></a>
203 <FONT color="green">200</FONT> * to the initial state (dy[i]/dy0[j] is in element array dYdY0[i][j]) at each successful<a name="line.200"></a>
204 <FONT color="green">201</FONT> * step (and hence at the end of integration)<a name="line.201"></a>
205 <FONT color="green">202</FONT> * @param dYdP placeholder where to put the state vector derivative with respect<a name="line.202"></a>
206 <FONT color="green">203</FONT> * to the parameters (dy[i]/dp[j] is in element array dYdP[i][j]) at each successful<a name="line.203"></a>
207 <FONT color="green">204</FONT> * step (and hence at the end of integration)<a name="line.204"></a>
208 <FONT color="green">205</FONT> * @return stop time, will be the same as target time if integration reached its<a name="line.205"></a>
209 <FONT color="green">206</FONT> * target, but may be different if some event handler stops it at some point.<a name="line.206"></a>
210 <FONT color="green">207</FONT> * @throws IntegratorException if the integrator cannot perform integration<a name="line.207"></a>
211 <FONT color="green">208</FONT> * @throws DerivativeException this exception is propagated to the caller if<a name="line.208"></a>
212 <FONT color="green">209</FONT> * the underlying user function triggers one<a name="line.209"></a>
213 <FONT color="green">210</FONT> */<a name="line.210"></a>
214 <FONT color="green">211</FONT> public double integrate(final double t0, final double[] y0, final double[][] dY0dP,<a name="line.211"></a>
215 <FONT color="green">212</FONT> final double t, final double[] y,<a name="line.212"></a>
216 <FONT color="green">213</FONT> final double[][] dYdY0, final double[][] dYdP)<a name="line.213"></a>
217 <FONT color="green">214</FONT> throws DerivativeException, IntegratorException {<a name="line.214"></a>
218 <FONT color="green">215</FONT> <a name="line.215"></a>
219 <FONT color="green">216</FONT> final int n = ode.getDimension();<a name="line.216"></a>
220 <FONT color="green">217</FONT> final int k = ode.getParametersDimension();<a name="line.217"></a>
221 <FONT color="green">218</FONT> checkDimension(n, y0);<a name="line.218"></a>
222 <FONT color="green">219</FONT> checkDimension(n, y);<a name="line.219"></a>
223 <FONT color="green">220</FONT> checkDimension(n, dYdY0);<a name="line.220"></a>
224 <FONT color="green">221</FONT> checkDimension(n, dYdY0[0]);<a name="line.221"></a>
225 <FONT color="green">222</FONT> if (k != 0) {<a name="line.222"></a>
226 <FONT color="green">223</FONT> checkDimension(n, dY0dP);<a name="line.223"></a>
227 <FONT color="green">224</FONT> checkDimension(k, dY0dP[0]);<a name="line.224"></a>
228 <FONT color="green">225</FONT> checkDimension(n, dYdP);<a name="line.225"></a>
229 <FONT color="green">226</FONT> checkDimension(k, dYdP[0]);<a name="line.226"></a>
230 <FONT color="green">227</FONT> }<a name="line.227"></a>
231 <FONT color="green">228</FONT> <a name="line.228"></a>
232 <FONT color="green">229</FONT> // set up initial state, including partial derivatives<a name="line.229"></a>
233 <FONT color="green">230</FONT> // the compound state z contains the raw state y and its derivatives<a name="line.230"></a>
234 <FONT color="green">231</FONT> // with respect to initial state y0 and to parameters p<a name="line.231"></a>
235 <FONT color="green">232</FONT> // y[i] is stored in z[i]<a name="line.232"></a>
236 <FONT color="green">233</FONT> // dy[i]/dy0[j] is stored in z[n + i * n + j]<a name="line.233"></a>
237 <FONT color="green">234</FONT> // dy[i]/dp[j] is stored in z[n * (n + 1) + i * k + j]<a name="line.234"></a>
238 <FONT color="green">235</FONT> final double[] z = new double[n * (1 + n + k)];<a name="line.235"></a>
239 <FONT color="green">236</FONT> System.arraycopy(y0, 0, z, 0, n);<a name="line.236"></a>
240 <FONT color="green">237</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.237"></a>
241 <FONT color="green">238</FONT> <a name="line.238"></a>
242 <FONT color="green">239</FONT> // set diagonal element of dy/dy0 to 1.0 at t = t0<a name="line.239"></a>
243 <FONT color="green">240</FONT> z[i * (1 + n) + n] = 1.0;<a name="line.240"></a>
244 <FONT color="green">241</FONT> <a name="line.241"></a>
245 <FONT color="green">242</FONT> // set initial derivatives with respect to parameters<a name="line.242"></a>
246 <FONT color="green">243</FONT> System.arraycopy(dY0dP[i], 0, z, n * (n + 1) + i * k, k);<a name="line.243"></a>
247 <FONT color="green">244</FONT> <a name="line.244"></a>
248 <FONT color="green">245</FONT> }<a name="line.245"></a>
249 <FONT color="green">246</FONT> <a name="line.246"></a>
250 <FONT color="green">247</FONT> // integrate the compound state variational equations<a name="line.247"></a>
251 <FONT color="green">248</FONT> evaluations = 0;<a name="line.248"></a>
252 <FONT color="green">249</FONT> final double stopTime = integrator.integrate(new MappingWrapper(), t0, z, t, z);<a name="line.249"></a>
253 <FONT color="green">250</FONT> <a name="line.250"></a>
254 <FONT color="green">251</FONT> // dispatch the final compound state into the state and partial derivatives arrays<a name="line.251"></a>
255 <FONT color="green">252</FONT> dispatchCompoundState(z, y, dYdY0, dYdP);<a name="line.252"></a>
256 <FONT color="green">253</FONT> <a name="line.253"></a>
257 <FONT color="green">254</FONT> return stopTime;<a name="line.254"></a>
258 <FONT color="green">255</FONT> <a name="line.255"></a>
259 <FONT color="green">256</FONT> }<a name="line.256"></a>
260 <FONT color="green">257</FONT> <a name="line.257"></a>
261 <FONT color="green">258</FONT> /** Dispatch a compound state array into state and jacobians arrays.<a name="line.258"></a>
262 <FONT color="green">259</FONT> * @param z compound state<a name="line.259"></a>
263 <FONT color="green">260</FONT> * @param y raw state array to fill<a name="line.260"></a>
264 <FONT color="green">261</FONT> * @param dydy0 jacobian array to fill<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @param dydp jacobian array to fill<a name="line.262"></a>
266 <FONT color="green">263</FONT> */<a name="line.263"></a>
267 <FONT color="green">264</FONT> private static void dispatchCompoundState(final double[] z, final double[] y,<a name="line.264"></a>
268 <FONT color="green">265</FONT> final double[][] dydy0, final double[][] dydp) {<a name="line.265"></a>
269 <FONT color="green">266</FONT> <a name="line.266"></a>
270 <FONT color="green">267</FONT> final int n = y.length;<a name="line.267"></a>
271 <FONT color="green">268</FONT> final int k = dydp[0].length;<a name="line.268"></a>
272 <FONT color="green">269</FONT> <a name="line.269"></a>
273 <FONT color="green">270</FONT> // state<a name="line.270"></a>
274 <FONT color="green">271</FONT> System.arraycopy(z, 0, y, 0, n);<a name="line.271"></a>
275 <FONT color="green">272</FONT> <a name="line.272"></a>
276 <FONT color="green">273</FONT> // jacobian with respect to initial state<a name="line.273"></a>
277 <FONT color="green">274</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.274"></a>
278 <FONT color="green">275</FONT> System.arraycopy(z, n * (i + 1), dydy0[i], 0, n);<a name="line.275"></a>
279 <FONT color="green">276</FONT> }<a name="line.276"></a>
280 <FONT color="green">277</FONT> <a name="line.277"></a>
281 <FONT color="green">278</FONT> // jacobian with respect to parameters<a name="line.278"></a>
282 <FONT color="green">279</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.279"></a>
283 <FONT color="green">280</FONT> System.arraycopy(z, n * (n + 1) + i * k, dydp[i], 0, k);<a name="line.280"></a>
284 <FONT color="green">281</FONT> }<a name="line.281"></a>
285 <FONT color="green">282</FONT> <a name="line.282"></a>
286 <FONT color="green">283</FONT> }<a name="line.283"></a>
287 <FONT color="green">284</FONT> <a name="line.284"></a>
288 <FONT color="green">285</FONT> /** Get the current value of the step start time t&lt;sub&gt;i&lt;/sub&gt;.<a name="line.285"></a>
289 <FONT color="green">286</FONT> * &lt;p&gt;This method can be called during integration (typically by<a name="line.286"></a>
290 <FONT color="green">287</FONT> * the object implementing the {@link FirstOrderDifferentialEquations<a name="line.287"></a>
291 <FONT color="green">288</FONT> * differential equations} problem) if the value of the current step that<a name="line.288"></a>
292 <FONT color="green">289</FONT> * is attempted is needed.&lt;/p&gt;<a name="line.289"></a>
293 <FONT color="green">290</FONT> * &lt;p&gt;The result is undefined if the method is called outside of<a name="line.290"></a>
294 <FONT color="green">291</FONT> * calls to &lt;code&gt;integrate&lt;/code&gt;.&lt;/p&gt;<a name="line.291"></a>
295 <FONT color="green">292</FONT> * @return current value of the step start time t&lt;sub&gt;i&lt;/sub&gt;<a name="line.292"></a>
296 <FONT color="green">293</FONT> */<a name="line.293"></a>
297 <FONT color="green">294</FONT> public double getCurrentStepStart() {<a name="line.294"></a>
298 <FONT color="green">295</FONT> return integrator.getCurrentStepStart();<a name="line.295"></a>
299 <FONT color="green">296</FONT> }<a name="line.296"></a>
300 <FONT color="green">297</FONT> <a name="line.297"></a>
301 <FONT color="green">298</FONT> /** Get the current signed value of the integration stepsize.<a name="line.298"></a>
302 <FONT color="green">299</FONT> * &lt;p&gt;This method can be called during integration (typically by<a name="line.299"></a>
303 <FONT color="green">300</FONT> * the object implementing the {@link FirstOrderDifferentialEquations<a name="line.300"></a>
304 <FONT color="green">301</FONT> * differential equations} problem) if the signed value of the current stepsize<a name="line.301"></a>
305 <FONT color="green">302</FONT> * that is tried is needed.&lt;/p&gt;<a name="line.302"></a>
306 <FONT color="green">303</FONT> * &lt;p&gt;The result is undefined if the method is called outside of<a name="line.303"></a>
307 <FONT color="green">304</FONT> * calls to &lt;code&gt;integrate&lt;/code&gt;.&lt;/p&gt;<a name="line.304"></a>
308 <FONT color="green">305</FONT> * @return current signed value of the stepsize<a name="line.305"></a>
309 <FONT color="green">306</FONT> */<a name="line.306"></a>
310 <FONT color="green">307</FONT> public double getCurrentSignedStepsize() {<a name="line.307"></a>
311 <FONT color="green">308</FONT> return integrator.getCurrentSignedStepsize();<a name="line.308"></a>
312 <FONT color="green">309</FONT> }<a name="line.309"></a>
313 <FONT color="green">310</FONT> <a name="line.310"></a>
314 <FONT color="green">311</FONT> /** Set the maximal number of differential equations function evaluations.<a name="line.311"></a>
315 <FONT color="green">312</FONT> * &lt;p&gt;The purpose of this method is to avoid infinite loops which can occur<a name="line.312"></a>
316 <FONT color="green">313</FONT> * for example when stringent error constraints are set or when lots of<a name="line.313"></a>
317 <FONT color="green">314</FONT> * discrete events are triggered, thus leading to many rejected steps.&lt;/p&gt;<a name="line.314"></a>
318 <FONT color="green">315</FONT> * @param maxEvaluations maximal number of function evaluations (negative<a name="line.315"></a>
319 <FONT color="green">316</FONT> * values are silently converted to maximal integer value, thus representing<a name="line.316"></a>
320 <FONT color="green">317</FONT> * almost unlimited evaluations)<a name="line.317"></a>
321 <FONT color="green">318</FONT> */<a name="line.318"></a>
322 <FONT color="green">319</FONT> public void setMaxEvaluations(int maxEvaluations) {<a name="line.319"></a>
323 <FONT color="green">320</FONT> this.maxEvaluations = (maxEvaluations &lt; 0) ? Integer.MAX_VALUE : maxEvaluations;<a name="line.320"></a>
324 <FONT color="green">321</FONT> }<a name="line.321"></a>
325 <FONT color="green">322</FONT> <a name="line.322"></a>
326 <FONT color="green">323</FONT> /** Get the maximal number of functions evaluations.<a name="line.323"></a>
327 <FONT color="green">324</FONT> * @return maximal number of functions evaluations<a name="line.324"></a>
328 <FONT color="green">325</FONT> */<a name="line.325"></a>
329 <FONT color="green">326</FONT> public int getMaxEvaluations() {<a name="line.326"></a>
330 <FONT color="green">327</FONT> return maxEvaluations;<a name="line.327"></a>
331 <FONT color="green">328</FONT> }<a name="line.328"></a>
332 <FONT color="green">329</FONT> <a name="line.329"></a>
333 <FONT color="green">330</FONT> /** Get the number of evaluations of the differential equations function.<a name="line.330"></a>
334 <FONT color="green">331</FONT> * &lt;p&gt;<a name="line.331"></a>
335 <FONT color="green">332</FONT> * The number of evaluations corresponds to the last call to the<a name="line.332"></a>
336 <FONT color="green">333</FONT> * &lt;code&gt;integrate&lt;/code&gt; method. It is 0 if the method has not been called yet.<a name="line.333"></a>
337 <FONT color="green">334</FONT> * &lt;/p&gt;<a name="line.334"></a>
338 <FONT color="green">335</FONT> * @return number of evaluations of the differential equations function<a name="line.335"></a>
339 <FONT color="green">336</FONT> */<a name="line.336"></a>
340 <FONT color="green">337</FONT> public int getEvaluations() {<a name="line.337"></a>
341 <FONT color="green">338</FONT> return evaluations;<a name="line.338"></a>
342 <FONT color="green">339</FONT> }<a name="line.339"></a>
343 <FONT color="green">340</FONT> <a name="line.340"></a>
344 <FONT color="green">341</FONT> /** Check array dimensions.<a name="line.341"></a>
345 <FONT color="green">342</FONT> * @param expected expected dimension<a name="line.342"></a>
346 <FONT color="green">343</FONT> * @param array (may be null if expected is 0)<a name="line.343"></a>
347 <FONT color="green">344</FONT> * @throws IllegalArgumentException if the array dimension does not match the expected one<a name="line.344"></a>
348 <FONT color="green">345</FONT> */<a name="line.345"></a>
349 <FONT color="green">346</FONT> private void checkDimension(final int expected, final Object array)<a name="line.346"></a>
350 <FONT color="green">347</FONT> throws IllegalArgumentException {<a name="line.347"></a>
351 <FONT color="green">348</FONT> int arrayDimension = (array == null) ? 0 : Array.getLength(array);<a name="line.348"></a>
352 <FONT color="green">349</FONT> if (arrayDimension != expected) {<a name="line.349"></a>
353 <FONT color="green">350</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.350"></a>
354 <FONT color="green">351</FONT> "dimension mismatch {0} != {1}", arrayDimension, expected);<a name="line.351"></a>
355 <FONT color="green">352</FONT> }<a name="line.352"></a>
356 <FONT color="green">353</FONT> }<a name="line.353"></a>
357 <FONT color="green">354</FONT> <a name="line.354"></a>
358 <FONT color="green">355</FONT> /** Wrapper class used to map state and jacobians into compound state. */<a name="line.355"></a>
359 <FONT color="green">356</FONT> private class MappingWrapper implements FirstOrderDifferentialEquations {<a name="line.356"></a>
360 <FONT color="green">357</FONT> <a name="line.357"></a>
361 <FONT color="green">358</FONT> /** Current state. */<a name="line.358"></a>
362 <FONT color="green">359</FONT> private final double[] y;<a name="line.359"></a>
363 <FONT color="green">360</FONT> <a name="line.360"></a>
364 <FONT color="green">361</FONT> /** Time derivative of the current state. */<a name="line.361"></a>
365 <FONT color="green">362</FONT> private final double[] yDot;<a name="line.362"></a>
366 <FONT color="green">363</FONT> <a name="line.363"></a>
367 <FONT color="green">364</FONT> /** Derivatives of yDot with respect to state. */<a name="line.364"></a>
368 <FONT color="green">365</FONT> private final double[][] dFdY;<a name="line.365"></a>
369 <FONT color="green">366</FONT> <a name="line.366"></a>
370 <FONT color="green">367</FONT> /** Derivatives of yDot with respect to parameters. */<a name="line.367"></a>
371 <FONT color="green">368</FONT> private final double[][] dFdP;<a name="line.368"></a>
372 <FONT color="green">369</FONT> <a name="line.369"></a>
373 <FONT color="green">370</FONT> /** Simple constructor.<a name="line.370"></a>
374 <FONT color="green">371</FONT> */<a name="line.371"></a>
375 <FONT color="green">372</FONT> public MappingWrapper() {<a name="line.372"></a>
376 <FONT color="green">373</FONT> <a name="line.373"></a>
377 <FONT color="green">374</FONT> final int n = ode.getDimension();<a name="line.374"></a>
378 <FONT color="green">375</FONT> final int k = ode.getParametersDimension();<a name="line.375"></a>
379 <FONT color="green">376</FONT> y = new double[n];<a name="line.376"></a>
380 <FONT color="green">377</FONT> yDot = new double[n];<a name="line.377"></a>
381 <FONT color="green">378</FONT> dFdY = new double[n][n];<a name="line.378"></a>
382 <FONT color="green">379</FONT> dFdP = new double[n][k];<a name="line.379"></a>
383 <FONT color="green">380</FONT> <a name="line.380"></a>
384 <FONT color="green">381</FONT> }<a name="line.381"></a>
385 <FONT color="green">382</FONT> <a name="line.382"></a>
386 <FONT color="green">383</FONT> /** {@inheritDoc} */<a name="line.383"></a>
387 <FONT color="green">384</FONT> public int getDimension() {<a name="line.384"></a>
388 <FONT color="green">385</FONT> final int n = y.length;<a name="line.385"></a>
389 <FONT color="green">386</FONT> final int k = dFdP[0].length;<a name="line.386"></a>
390 <FONT color="green">387</FONT> return n * (1 + n + k);<a name="line.387"></a>
391 <FONT color="green">388</FONT> }<a name="line.388"></a>
392 <FONT color="green">389</FONT> <a name="line.389"></a>
393 <FONT color="green">390</FONT> /** {@inheritDoc} */<a name="line.390"></a>
394 <FONT color="green">391</FONT> public void computeDerivatives(final double t, final double[] z, final double[] zDot)<a name="line.391"></a>
395 <FONT color="green">392</FONT> throws DerivativeException {<a name="line.392"></a>
396 <FONT color="green">393</FONT> <a name="line.393"></a>
397 <FONT color="green">394</FONT> final int n = y.length;<a name="line.394"></a>
398 <FONT color="green">395</FONT> final int k = dFdP[0].length;<a name="line.395"></a>
399 <FONT color="green">396</FONT> <a name="line.396"></a>
400 <FONT color="green">397</FONT> // compute raw ODE and its jacobians: dy/dt, d[dy/dt]/dy0 and d[dy/dt]/dp<a name="line.397"></a>
401 <FONT color="green">398</FONT> System.arraycopy(z, 0, y, 0, n);<a name="line.398"></a>
402 <FONT color="green">399</FONT> if (++evaluations &gt; maxEvaluations) {<a name="line.399"></a>
403 <FONT color="green">400</FONT> throw new DerivativeException(new MaxEvaluationsExceededException(maxEvaluations));<a name="line.400"></a>
404 <FONT color="green">401</FONT> }<a name="line.401"></a>
405 <FONT color="green">402</FONT> ode.computeDerivatives(t, y, yDot);<a name="line.402"></a>
406 <FONT color="green">403</FONT> ode.computeJacobians(t, y, yDot, dFdY, dFdP);<a name="line.403"></a>
407 <FONT color="green">404</FONT> <a name="line.404"></a>
408 <FONT color="green">405</FONT> // state part of the compound equations<a name="line.405"></a>
409 <FONT color="green">406</FONT> System.arraycopy(yDot, 0, zDot, 0, n);<a name="line.406"></a>
410 <FONT color="green">407</FONT> <a name="line.407"></a>
411 <FONT color="green">408</FONT> // variational equations: from d[dy/dt]/dy0 to d[dy/dy0]/dt<a name="line.408"></a>
412 <FONT color="green">409</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.409"></a>
413 <FONT color="green">410</FONT> final double[] dFdYi = dFdY[i];<a name="line.410"></a>
414 <FONT color="green">411</FONT> for (int j = 0; j &lt; n; ++j) {<a name="line.411"></a>
415 <FONT color="green">412</FONT> double s = 0;<a name="line.412"></a>
416 <FONT color="green">413</FONT> final int startIndex = n + j;<a name="line.413"></a>
417 <FONT color="green">414</FONT> int zIndex = startIndex;<a name="line.414"></a>
418 <FONT color="green">415</FONT> for (int l = 0; l &lt; n; ++l) {<a name="line.415"></a>
419 <FONT color="green">416</FONT> s += dFdYi[l] * z[zIndex];<a name="line.416"></a>
420 <FONT color="green">417</FONT> zIndex += n;<a name="line.417"></a>
421 <FONT color="green">418</FONT> }<a name="line.418"></a>
422 <FONT color="green">419</FONT> zDot[startIndex + i * n] = s;<a name="line.419"></a>
423 <FONT color="green">420</FONT> }<a name="line.420"></a>
424 <FONT color="green">421</FONT> }<a name="line.421"></a>
425 <FONT color="green">422</FONT> <a name="line.422"></a>
426 <FONT color="green">423</FONT> // variational equations: from d[dy/dt]/dy0 and d[dy/dt]/dp to d[dy/dp]/dt<a name="line.423"></a>
427 <FONT color="green">424</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.424"></a>
428 <FONT color="green">425</FONT> final double[] dFdYi = dFdY[i];<a name="line.425"></a>
429 <FONT color="green">426</FONT> final double[] dFdPi = dFdP[i];<a name="line.426"></a>
430 <FONT color="green">427</FONT> for (int j = 0; j &lt; k; ++j) {<a name="line.427"></a>
431 <FONT color="green">428</FONT> double s = dFdPi[j];<a name="line.428"></a>
432 <FONT color="green">429</FONT> final int startIndex = n * (n + 1) + j;<a name="line.429"></a>
433 <FONT color="green">430</FONT> int zIndex = startIndex;<a name="line.430"></a>
434 <FONT color="green">431</FONT> for (int l = 0; l &lt; n; ++l) {<a name="line.431"></a>
435 <FONT color="green">432</FONT> s += dFdYi[l] * z[zIndex];<a name="line.432"></a>
436 <FONT color="green">433</FONT> zIndex += k;<a name="line.433"></a>
437 <FONT color="green">434</FONT> }<a name="line.434"></a>
438 <FONT color="green">435</FONT> zDot[startIndex + i * k] = s;<a name="line.435"></a>
439 <FONT color="green">436</FONT> }<a name="line.436"></a>
440 <FONT color="green">437</FONT> }<a name="line.437"></a>
441 <FONT color="green">438</FONT> <a name="line.438"></a>
442 <FONT color="green">439</FONT> }<a name="line.439"></a>
443 <FONT color="green">440</FONT> <a name="line.440"></a>
444 <FONT color="green">441</FONT> }<a name="line.441"></a>
445 <FONT color="green">442</FONT> <a name="line.442"></a>
446 <FONT color="green">443</FONT> /** Wrapper class to compute jacobians by finite differences for ODE which do not compute them themselves. */<a name="line.443"></a>
447 <FONT color="green">444</FONT> private class FiniteDifferencesWrapper<a name="line.444"></a>
448 <FONT color="green">445</FONT> implements ODEWithJacobians {<a name="line.445"></a>
449 <FONT color="green">446</FONT> <a name="line.446"></a>
450 <FONT color="green">447</FONT> /** Raw ODE without jacobians computation. */<a name="line.447"></a>
451 <FONT color="green">448</FONT> private final ParameterizedODE ode;<a name="line.448"></a>
452 <FONT color="green">449</FONT> <a name="line.449"></a>
453 <FONT color="green">450</FONT> /** Parameters array (may be null if parameters dimension from original problem is zero) */<a name="line.450"></a>
454 <FONT color="green">451</FONT> private final double[] p;<a name="line.451"></a>
455 <FONT color="green">452</FONT> <a name="line.452"></a>
456 <FONT color="green">453</FONT> /** Step sizes to use for computing the jacobian df/dy. */<a name="line.453"></a>
457 <FONT color="green">454</FONT> private final double[] hY;<a name="line.454"></a>
458 <FONT color="green">455</FONT> <a name="line.455"></a>
459 <FONT color="green">456</FONT> /** Step sizes to use for computing the jacobian df/dp. */<a name="line.456"></a>
460 <FONT color="green">457</FONT> private final double[] hP;<a name="line.457"></a>
461 <FONT color="green">458</FONT> <a name="line.458"></a>
462 <FONT color="green">459</FONT> /** Temporary array for state derivatives used to compute jacobians. */<a name="line.459"></a>
463 <FONT color="green">460</FONT> private final double[] tmpDot;<a name="line.460"></a>
464 <FONT color="green">461</FONT> <a name="line.461"></a>
465 <FONT color="green">462</FONT> /** Simple constructor.<a name="line.462"></a>
466 <FONT color="green">463</FONT> * @param ode original ODE problem, without jacobians computations<a name="line.463"></a>
467 <FONT color="green">464</FONT> * @param p parameters array (may be null if parameters dimension from original problem is zero)<a name="line.464"></a>
468 <FONT color="green">465</FONT> * @param hY step sizes to use for computing the jacobian df/dy<a name="line.465"></a>
469 <FONT color="green">466</FONT> * @param hP step sizes to use for computing the jacobian df/dp<a name="line.466"></a>
470 <FONT color="green">467</FONT> */<a name="line.467"></a>
471 <FONT color="green">468</FONT> public FiniteDifferencesWrapper(final ParameterizedODE ode,<a name="line.468"></a>
472 <FONT color="green">469</FONT> final double[] p, final double[] hY, final double[] hP) {<a name="line.469"></a>
473 <FONT color="green">470</FONT> this.ode = ode;<a name="line.470"></a>
474 <FONT color="green">471</FONT> this.p = p.clone();<a name="line.471"></a>
475 <FONT color="green">472</FONT> this.hY = hY.clone();<a name="line.472"></a>
476 <FONT color="green">473</FONT> this.hP = hP.clone();<a name="line.473"></a>
477 <FONT color="green">474</FONT> tmpDot = new double[ode.getDimension()];<a name="line.474"></a>
478 <FONT color="green">475</FONT> }<a name="line.475"></a>
479 <FONT color="green">476</FONT> <a name="line.476"></a>
480 <FONT color="green">477</FONT> /** {@inheritDoc} */<a name="line.477"></a>
481 <FONT color="green">478</FONT> public int getDimension() {<a name="line.478"></a>
482 <FONT color="green">479</FONT> return ode.getDimension();<a name="line.479"></a>
483 <FONT color="green">480</FONT> }<a name="line.480"></a>
484 <FONT color="green">481</FONT> <a name="line.481"></a>
485 <FONT color="green">482</FONT> /** {@inheritDoc} */<a name="line.482"></a>
486 <FONT color="green">483</FONT> public void computeDerivatives(double t, double[] y, double[] yDot) throws DerivativeException {<a name="line.483"></a>
487 <FONT color="green">484</FONT> // this call to computeDerivatives has already been counted,<a name="line.484"></a>
488 <FONT color="green">485</FONT> // we must not increment the counter again<a name="line.485"></a>
489 <FONT color="green">486</FONT> ode.computeDerivatives(t, y, yDot);<a name="line.486"></a>
490 <FONT color="green">487</FONT> }<a name="line.487"></a>
491 <FONT color="green">488</FONT> <a name="line.488"></a>
492 <FONT color="green">489</FONT> /** {@inheritDoc} */<a name="line.489"></a>
493 <FONT color="green">490</FONT> public int getParametersDimension() {<a name="line.490"></a>
494 <FONT color="green">491</FONT> return ode.getParametersDimension();<a name="line.491"></a>
495 <FONT color="green">492</FONT> }<a name="line.492"></a>
496 <FONT color="green">493</FONT> <a name="line.493"></a>
497 <FONT color="green">494</FONT> /** {@inheritDoc} */<a name="line.494"></a>
498 <FONT color="green">495</FONT> public void computeJacobians(double t, double[] y, double[] yDot,<a name="line.495"></a>
499 <FONT color="green">496</FONT> double[][] dFdY, double[][] dFdP)<a name="line.496"></a>
500 <FONT color="green">497</FONT> throws DerivativeException {<a name="line.497"></a>
501 <FONT color="green">498</FONT> <a name="line.498"></a>
502 <FONT color="green">499</FONT> final int n = hY.length;<a name="line.499"></a>
503 <FONT color="green">500</FONT> final int k = hP.length;<a name="line.500"></a>
504 <FONT color="green">501</FONT> <a name="line.501"></a>
505 <FONT color="green">502</FONT> evaluations += n + k;<a name="line.502"></a>
506 <FONT color="green">503</FONT> if (evaluations &gt; maxEvaluations) {<a name="line.503"></a>
507 <FONT color="green">504</FONT> throw new DerivativeException(new MaxEvaluationsExceededException(maxEvaluations));<a name="line.504"></a>
508 <FONT color="green">505</FONT> }<a name="line.505"></a>
509 <FONT color="green">506</FONT> <a name="line.506"></a>
510 <FONT color="green">507</FONT> // compute df/dy where f is the ODE and y is the state array<a name="line.507"></a>
511 <FONT color="green">508</FONT> for (int j = 0; j &lt; n; ++j) {<a name="line.508"></a>
512 <FONT color="green">509</FONT> final double savedYj = y[j];<a name="line.509"></a>
513 <FONT color="green">510</FONT> y[j] += hY[j];<a name="line.510"></a>
514 <FONT color="green">511</FONT> ode.computeDerivatives(t, y, tmpDot);<a name="line.511"></a>
515 <FONT color="green">512</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.512"></a>
516 <FONT color="green">513</FONT> dFdY[i][j] = (tmpDot[i] - yDot[i]) / hY[j];<a name="line.513"></a>
517 <FONT color="green">514</FONT> }<a name="line.514"></a>
518 <FONT color="green">515</FONT> y[j] = savedYj;<a name="line.515"></a>
519 <FONT color="green">516</FONT> }<a name="line.516"></a>
520 <FONT color="green">517</FONT> <a name="line.517"></a>
521 <FONT color="green">518</FONT> // compute df/dp where f is the ODE and p is the parameters array<a name="line.518"></a>
522 <FONT color="green">519</FONT> for (int j = 0; j &lt; k; ++j) {<a name="line.519"></a>
523 <FONT color="green">520</FONT> ode.setParameter(j, p[j] + hP[j]);<a name="line.520"></a>
524 <FONT color="green">521</FONT> ode.computeDerivatives(t, y, tmpDot);<a name="line.521"></a>
525 <FONT color="green">522</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.522"></a>
526 <FONT color="green">523</FONT> dFdP[i][j] = (tmpDot[i] - yDot[i]) / hP[j];<a name="line.523"></a>
527 <FONT color="green">524</FONT> }<a name="line.524"></a>
528 <FONT color="green">525</FONT> ode.setParameter(j, p[j]);<a name="line.525"></a>
529 <FONT color="green">526</FONT> }<a name="line.526"></a>
530 <FONT color="green">527</FONT> <a name="line.527"></a>
531 <FONT color="green">528</FONT> }<a name="line.528"></a>
532 <FONT color="green">529</FONT> <a name="line.529"></a>
533 <FONT color="green">530</FONT> }<a name="line.530"></a>
534 <FONT color="green">531</FONT> <a name="line.531"></a>
535 <FONT color="green">532</FONT> /** Wrapper for step handlers. */<a name="line.532"></a>
536 <FONT color="green">533</FONT> private static class StepHandlerWrapper implements StepHandler {<a name="line.533"></a>
537 <FONT color="green">534</FONT> <a name="line.534"></a>
538 <FONT color="green">535</FONT> /** Underlying step handler with jacobians. */<a name="line.535"></a>
539 <FONT color="green">536</FONT> private final StepHandlerWithJacobians handler;<a name="line.536"></a>
540 <FONT color="green">537</FONT> <a name="line.537"></a>
541 <FONT color="green">538</FONT> /** Dimension of the original ODE. */<a name="line.538"></a>
542 <FONT color="green">539</FONT> private final int n;<a name="line.539"></a>
543 <FONT color="green">540</FONT> <a name="line.540"></a>
544 <FONT color="green">541</FONT> /** Number of parameters. */<a name="line.541"></a>
545 <FONT color="green">542</FONT> private final int k;<a name="line.542"></a>
546 <FONT color="green">543</FONT> <a name="line.543"></a>
547 <FONT color="green">544</FONT> /** Simple constructor.<a name="line.544"></a>
548 <FONT color="green">545</FONT> * @param handler underlying step handler with jacobians<a name="line.545"></a>
549 <FONT color="green">546</FONT> * @param n dimension of the original ODE<a name="line.546"></a>
550 <FONT color="green">547</FONT> * @param k number of parameters<a name="line.547"></a>
551 <FONT color="green">548</FONT> */<a name="line.548"></a>
552 <FONT color="green">549</FONT> public StepHandlerWrapper(final StepHandlerWithJacobians handler,<a name="line.549"></a>
553 <FONT color="green">550</FONT> final int n, final int k) {<a name="line.550"></a>
554 <FONT color="green">551</FONT> this.handler = handler;<a name="line.551"></a>
555 <FONT color="green">552</FONT> this.n = n;<a name="line.552"></a>
556 <FONT color="green">553</FONT> this.k = k;<a name="line.553"></a>
557 <FONT color="green">554</FONT> }<a name="line.554"></a>
558 <FONT color="green">555</FONT> <a name="line.555"></a>
559 <FONT color="green">556</FONT> /** Get the underlying step handler with jacobians.<a name="line.556"></a>
560 <FONT color="green">557</FONT> * @return underlying step handler with jacobians<a name="line.557"></a>
561 <FONT color="green">558</FONT> */<a name="line.558"></a>
562 <FONT color="green">559</FONT> public StepHandlerWithJacobians getHandler() {<a name="line.559"></a>
563 <FONT color="green">560</FONT> return handler;<a name="line.560"></a>
564 <FONT color="green">561</FONT> }<a name="line.561"></a>
565 <FONT color="green">562</FONT> <a name="line.562"></a>
566 <FONT color="green">563</FONT> /** {@inheritDoc} */<a name="line.563"></a>
567 <FONT color="green">564</FONT> public void handleStep(StepInterpolator interpolator, boolean isLast)<a name="line.564"></a>
568 <FONT color="green">565</FONT> throws DerivativeException {<a name="line.565"></a>
569 <FONT color="green">566</FONT> handler.handleStep(new StepInterpolatorWrapper(interpolator, n, k), isLast);<a name="line.566"></a>
570 <FONT color="green">567</FONT> }<a name="line.567"></a>
571 <FONT color="green">568</FONT> <a name="line.568"></a>
572 <FONT color="green">569</FONT> /** {@inheritDoc} */<a name="line.569"></a>
573 <FONT color="green">570</FONT> public boolean requiresDenseOutput() {<a name="line.570"></a>
574 <FONT color="green">571</FONT> return handler.requiresDenseOutput();<a name="line.571"></a>
575 <FONT color="green">572</FONT> }<a name="line.572"></a>
576 <FONT color="green">573</FONT> <a name="line.573"></a>
577 <FONT color="green">574</FONT> /** {@inheritDoc} */<a name="line.574"></a>
578 <FONT color="green">575</FONT> public void reset() {<a name="line.575"></a>
579 <FONT color="green">576</FONT> handler.reset();<a name="line.576"></a>
580 <FONT color="green">577</FONT> }<a name="line.577"></a>
581 <FONT color="green">578</FONT> <a name="line.578"></a>
582 <FONT color="green">579</FONT> }<a name="line.579"></a>
583 <FONT color="green">580</FONT> <a name="line.580"></a>
584 <FONT color="green">581</FONT> /** Wrapper for step interpolators. */<a name="line.581"></a>
585 <FONT color="green">582</FONT> private static class StepInterpolatorWrapper<a name="line.582"></a>
586 <FONT color="green">583</FONT> implements StepInterpolatorWithJacobians {<a name="line.583"></a>
587 <FONT color="green">584</FONT> <a name="line.584"></a>
588 <FONT color="green">585</FONT> /** Wrapped interpolator. */<a name="line.585"></a>
589 <FONT color="green">586</FONT> private StepInterpolator interpolator;<a name="line.586"></a>
590 <FONT color="green">587</FONT> <a name="line.587"></a>
591 <FONT color="green">588</FONT> /** State array. */<a name="line.588"></a>
592 <FONT color="green">589</FONT> private double[] y;<a name="line.589"></a>
593 <FONT color="green">590</FONT> <a name="line.590"></a>
594 <FONT color="green">591</FONT> /** Jacobian with respect to initial state dy/dy0. */<a name="line.591"></a>
595 <FONT color="green">592</FONT> private double[][] dydy0;<a name="line.592"></a>
596 <FONT color="green">593</FONT> <a name="line.593"></a>
597 <FONT color="green">594</FONT> /** Jacobian with respect to parameters dy/dp. */<a name="line.594"></a>
598 <FONT color="green">595</FONT> private double[][] dydp;<a name="line.595"></a>
599 <FONT color="green">596</FONT> <a name="line.596"></a>
600 <FONT color="green">597</FONT> /** Time derivative of the state array. */<a name="line.597"></a>
601 <FONT color="green">598</FONT> private double[] yDot;<a name="line.598"></a>
602 <FONT color="green">599</FONT> <a name="line.599"></a>
603 <FONT color="green">600</FONT> /** Time derivative of the sacobian with respect to initial state dy/dy0. */<a name="line.600"></a>
604 <FONT color="green">601</FONT> private double[][] dydy0Dot;<a name="line.601"></a>
605 <FONT color="green">602</FONT> <a name="line.602"></a>
606 <FONT color="green">603</FONT> /** Time derivative of the jacobian with respect to parameters dy/dp. */<a name="line.603"></a>
607 <FONT color="green">604</FONT> private double[][] dydpDot;<a name="line.604"></a>
608 <FONT color="green">605</FONT> <a name="line.605"></a>
609 <FONT color="green">606</FONT> /** Simple constructor.<a name="line.606"></a>
610 <FONT color="green">607</FONT> * &lt;p&gt;This constructor is used only for externalization. It does nothing.&lt;/p&gt;<a name="line.607"></a>
611 <FONT color="green">608</FONT> */<a name="line.608"></a>
612 <FONT color="green">609</FONT> @SuppressWarnings("unused")<a name="line.609"></a>
613 <FONT color="green">610</FONT> public StepInterpolatorWrapper() {<a name="line.610"></a>
614 <FONT color="green">611</FONT> }<a name="line.611"></a>
615 <FONT color="green">612</FONT> <a name="line.612"></a>
616 <FONT color="green">613</FONT> /** Simple constructor.<a name="line.613"></a>
617 <FONT color="green">614</FONT> * @param interpolator wrapped interpolator<a name="line.614"></a>
618 <FONT color="green">615</FONT> * @param n dimension of the original ODE<a name="line.615"></a>
619 <FONT color="green">616</FONT> * @param k number of parameters<a name="line.616"></a>
620 <FONT color="green">617</FONT> */<a name="line.617"></a>
621 <FONT color="green">618</FONT> public StepInterpolatorWrapper(final StepInterpolator interpolator,<a name="line.618"></a>
622 <FONT color="green">619</FONT> final int n, final int k) {<a name="line.619"></a>
623 <FONT color="green">620</FONT> this.interpolator = interpolator;<a name="line.620"></a>
624 <FONT color="green">621</FONT> y = new double[n];<a name="line.621"></a>
625 <FONT color="green">622</FONT> dydy0 = new double[n][n];<a name="line.622"></a>
626 <FONT color="green">623</FONT> dydp = new double[n][k];<a name="line.623"></a>
627 <FONT color="green">624</FONT> yDot = new double[n];<a name="line.624"></a>
628 <FONT color="green">625</FONT> dydy0Dot = new double[n][n];<a name="line.625"></a>
629 <FONT color="green">626</FONT> dydpDot = new double[n][k];<a name="line.626"></a>
630 <FONT color="green">627</FONT> }<a name="line.627"></a>
631 <FONT color="green">628</FONT> <a name="line.628"></a>
632 <FONT color="green">629</FONT> /** {@inheritDoc} */<a name="line.629"></a>
633 <FONT color="green">630</FONT> public void setInterpolatedTime(double time) {<a name="line.630"></a>
634 <FONT color="green">631</FONT> interpolator.setInterpolatedTime(time);<a name="line.631"></a>
635 <FONT color="green">632</FONT> }<a name="line.632"></a>
636 <FONT color="green">633</FONT> <a name="line.633"></a>
637 <FONT color="green">634</FONT> /** {@inheritDoc} */<a name="line.634"></a>
638 <FONT color="green">635</FONT> public boolean isForward() {<a name="line.635"></a>
639 <FONT color="green">636</FONT> return interpolator.isForward();<a name="line.636"></a>
640 <FONT color="green">637</FONT> }<a name="line.637"></a>
641 <FONT color="green">638</FONT> <a name="line.638"></a>
642 <FONT color="green">639</FONT> /** {@inheritDoc} */<a name="line.639"></a>
643 <FONT color="green">640</FONT> public double getPreviousTime() {<a name="line.640"></a>
644 <FONT color="green">641</FONT> return interpolator.getPreviousTime();<a name="line.641"></a>
645 <FONT color="green">642</FONT> }<a name="line.642"></a>
646 <FONT color="green">643</FONT> <a name="line.643"></a>
647 <FONT color="green">644</FONT> /** {@inheritDoc} */<a name="line.644"></a>
648 <FONT color="green">645</FONT> public double getInterpolatedTime() {<a name="line.645"></a>
649 <FONT color="green">646</FONT> return interpolator.getInterpolatedTime();<a name="line.646"></a>
650 <FONT color="green">647</FONT> }<a name="line.647"></a>
651 <FONT color="green">648</FONT> <a name="line.648"></a>
652 <FONT color="green">649</FONT> /** {@inheritDoc} */<a name="line.649"></a>
653 <FONT color="green">650</FONT> public double[] getInterpolatedY() throws DerivativeException {<a name="line.650"></a>
654 <FONT color="green">651</FONT> double[] extendedState = interpolator.getInterpolatedState();<a name="line.651"></a>
655 <FONT color="green">652</FONT> System.arraycopy(extendedState, 0, y, 0, y.length);<a name="line.652"></a>
656 <FONT color="green">653</FONT> return y;<a name="line.653"></a>
657 <FONT color="green">654</FONT> }<a name="line.654"></a>
658 <FONT color="green">655</FONT> <a name="line.655"></a>
659 <FONT color="green">656</FONT> /** {@inheritDoc} */<a name="line.656"></a>
660 <FONT color="green">657</FONT> public double[][] getInterpolatedDyDy0() throws DerivativeException {<a name="line.657"></a>
661 <FONT color="green">658</FONT> double[] extendedState = interpolator.getInterpolatedState();<a name="line.658"></a>
662 <FONT color="green">659</FONT> final int n = y.length;<a name="line.659"></a>
663 <FONT color="green">660</FONT> int start = n;<a name="line.660"></a>
664 <FONT color="green">661</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.661"></a>
665 <FONT color="green">662</FONT> System.arraycopy(extendedState, start, dydy0[i], 0, n);<a name="line.662"></a>
666 <FONT color="green">663</FONT> start += n;<a name="line.663"></a>
667 <FONT color="green">664</FONT> }<a name="line.664"></a>
668 <FONT color="green">665</FONT> return dydy0;<a name="line.665"></a>
669 <FONT color="green">666</FONT> }<a name="line.666"></a>
670 <FONT color="green">667</FONT> <a name="line.667"></a>
671 <FONT color="green">668</FONT> /** {@inheritDoc} */<a name="line.668"></a>
672 <FONT color="green">669</FONT> public double[][] getInterpolatedDyDp() throws DerivativeException {<a name="line.669"></a>
673 <FONT color="green">670</FONT> double[] extendedState = interpolator.getInterpolatedState();<a name="line.670"></a>
674 <FONT color="green">671</FONT> final int n = y.length;<a name="line.671"></a>
675 <FONT color="green">672</FONT> final int k = dydp[0].length;<a name="line.672"></a>
676 <FONT color="green">673</FONT> int start = n * (n + 1);<a name="line.673"></a>
677 <FONT color="green">674</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.674"></a>
678 <FONT color="green">675</FONT> System.arraycopy(extendedState, start, dydp[i], 0, k);<a name="line.675"></a>
679 <FONT color="green">676</FONT> start += k;<a name="line.676"></a>
680 <FONT color="green">677</FONT> }<a name="line.677"></a>
681 <FONT color="green">678</FONT> return dydp;<a name="line.678"></a>
682 <FONT color="green">679</FONT> }<a name="line.679"></a>
683 <FONT color="green">680</FONT> <a name="line.680"></a>
684 <FONT color="green">681</FONT> /** {@inheritDoc} */<a name="line.681"></a>
685 <FONT color="green">682</FONT> public double[] getInterpolatedYDot() throws DerivativeException {<a name="line.682"></a>
686 <FONT color="green">683</FONT> double[] extendedDerivatives = interpolator.getInterpolatedDerivatives();<a name="line.683"></a>
687 <FONT color="green">684</FONT> System.arraycopy(extendedDerivatives, 0, yDot, 0, yDot.length);<a name="line.684"></a>
688 <FONT color="green">685</FONT> return yDot;<a name="line.685"></a>
689 <FONT color="green">686</FONT> }<a name="line.686"></a>
690 <FONT color="green">687</FONT> <a name="line.687"></a>
691 <FONT color="green">688</FONT> /** {@inheritDoc} */<a name="line.688"></a>
692 <FONT color="green">689</FONT> public double[][] getInterpolatedDyDy0Dot() throws DerivativeException {<a name="line.689"></a>
693 <FONT color="green">690</FONT> double[] extendedDerivatives = interpolator.getInterpolatedDerivatives();<a name="line.690"></a>
694 <FONT color="green">691</FONT> final int n = y.length;<a name="line.691"></a>
695 <FONT color="green">692</FONT> int start = n;<a name="line.692"></a>
696 <FONT color="green">693</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.693"></a>
697 <FONT color="green">694</FONT> System.arraycopy(extendedDerivatives, start, dydy0Dot[i], 0, n);<a name="line.694"></a>
698 <FONT color="green">695</FONT> start += n;<a name="line.695"></a>
699 <FONT color="green">696</FONT> }<a name="line.696"></a>
700 <FONT color="green">697</FONT> return dydy0Dot;<a name="line.697"></a>
701 <FONT color="green">698</FONT> }<a name="line.698"></a>
702 <FONT color="green">699</FONT> <a name="line.699"></a>
703 <FONT color="green">700</FONT> /** {@inheritDoc} */<a name="line.700"></a>
704 <FONT color="green">701</FONT> public double[][] getInterpolatedDyDpDot() throws DerivativeException {<a name="line.701"></a>
705 <FONT color="green">702</FONT> double[] extendedDerivatives = interpolator.getInterpolatedDerivatives();<a name="line.702"></a>
706 <FONT color="green">703</FONT> final int n = y.length;<a name="line.703"></a>
707 <FONT color="green">704</FONT> final int k = dydpDot[0].length;<a name="line.704"></a>
708 <FONT color="green">705</FONT> int start = n * (n + 1);<a name="line.705"></a>
709 <FONT color="green">706</FONT> for (int i = 0; i &lt; n; ++i) {<a name="line.706"></a>
710 <FONT color="green">707</FONT> System.arraycopy(extendedDerivatives, start, dydpDot[i], 0, k);<a name="line.707"></a>
711 <FONT color="green">708</FONT> start += k;<a name="line.708"></a>
712 <FONT color="green">709</FONT> }<a name="line.709"></a>
713 <FONT color="green">710</FONT> return dydpDot;<a name="line.710"></a>
714 <FONT color="green">711</FONT> }<a name="line.711"></a>
715 <FONT color="green">712</FONT> <a name="line.712"></a>
716 <FONT color="green">713</FONT> /** {@inheritDoc} */<a name="line.713"></a>
717 <FONT color="green">714</FONT> public double getCurrentTime() {<a name="line.714"></a>
718 <FONT color="green">715</FONT> return interpolator.getCurrentTime();<a name="line.715"></a>
719 <FONT color="green">716</FONT> }<a name="line.716"></a>
720 <FONT color="green">717</FONT> <a name="line.717"></a>
721 <FONT color="green">718</FONT> /** {@inheritDoc} */<a name="line.718"></a>
722 <FONT color="green">719</FONT> public StepInterpolatorWithJacobians copy() throws DerivativeException {<a name="line.719"></a>
723 <FONT color="green">720</FONT> final int n = y.length;<a name="line.720"></a>
724 <FONT color="green">721</FONT> final int k = dydp[0].length;<a name="line.721"></a>
725 <FONT color="green">722</FONT> StepInterpolatorWrapper copied =<a name="line.722"></a>
726 <FONT color="green">723</FONT> new StepInterpolatorWrapper(interpolator.copy(), n, k);<a name="line.723"></a>
727 <FONT color="green">724</FONT> copyArray(y, copied.y);<a name="line.724"></a>
728 <FONT color="green">725</FONT> copyArray(dydy0, copied.dydy0);<a name="line.725"></a>
729 <FONT color="green">726</FONT> copyArray(dydp, copied.dydp);<a name="line.726"></a>
730 <FONT color="green">727</FONT> copyArray(yDot, copied.yDot);<a name="line.727"></a>
731 <FONT color="green">728</FONT> copyArray(dydy0Dot, copied.dydy0Dot);<a name="line.728"></a>
732 <FONT color="green">729</FONT> copyArray(dydpDot, copied.dydpDot);<a name="line.729"></a>
733 <FONT color="green">730</FONT> return copied;<a name="line.730"></a>
734 <FONT color="green">731</FONT> }<a name="line.731"></a>
735 <FONT color="green">732</FONT> <a name="line.732"></a>
736 <FONT color="green">733</FONT> /** {@inheritDoc} */<a name="line.733"></a>
737 <FONT color="green">734</FONT> public void writeExternal(ObjectOutput out) throws IOException {<a name="line.734"></a>
738 <FONT color="green">735</FONT> out.writeObject(interpolator);<a name="line.735"></a>
739 <FONT color="green">736</FONT> out.writeInt(y.length);<a name="line.736"></a>
740 <FONT color="green">737</FONT> out.writeInt(dydp[0].length);<a name="line.737"></a>
741 <FONT color="green">738</FONT> writeArray(out, y);<a name="line.738"></a>
742 <FONT color="green">739</FONT> writeArray(out, dydy0);<a name="line.739"></a>
743 <FONT color="green">740</FONT> writeArray(out, dydp);<a name="line.740"></a>
744 <FONT color="green">741</FONT> writeArray(out, yDot);<a name="line.741"></a>
745 <FONT color="green">742</FONT> writeArray(out, dydy0Dot);<a name="line.742"></a>
746 <FONT color="green">743</FONT> writeArray(out, dydpDot);<a name="line.743"></a>
747 <FONT color="green">744</FONT> }<a name="line.744"></a>
748 <FONT color="green">745</FONT> <a name="line.745"></a>
749 <FONT color="green">746</FONT> /** {@inheritDoc} */<a name="line.746"></a>
750 <FONT color="green">747</FONT> public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {<a name="line.747"></a>
751 <FONT color="green">748</FONT> interpolator = (StepInterpolator) in.readObject();<a name="line.748"></a>
752 <FONT color="green">749</FONT> final int n = in.readInt();<a name="line.749"></a>
753 <FONT color="green">750</FONT> final int k = in.readInt();<a name="line.750"></a>
754 <FONT color="green">751</FONT> y = new double[n];<a name="line.751"></a>
755 <FONT color="green">752</FONT> dydy0 = new double[n][n];<a name="line.752"></a>
756 <FONT color="green">753</FONT> dydp = new double[n][k];<a name="line.753"></a>
757 <FONT color="green">754</FONT> yDot = new double[n];<a name="line.754"></a>
758 <FONT color="green">755</FONT> dydy0Dot = new double[n][n];<a name="line.755"></a>
759 <FONT color="green">756</FONT> dydpDot = new double[n][k];<a name="line.756"></a>
760 <FONT color="green">757</FONT> readArray(in, y);<a name="line.757"></a>
761 <FONT color="green">758</FONT> readArray(in, dydy0);<a name="line.758"></a>
762 <FONT color="green">759</FONT> readArray(in, dydp);<a name="line.759"></a>
763 <FONT color="green">760</FONT> readArray(in, yDot);<a name="line.760"></a>
764 <FONT color="green">761</FONT> readArray(in, dydy0Dot);<a name="line.761"></a>
765 <FONT color="green">762</FONT> readArray(in, dydpDot);<a name="line.762"></a>
766 <FONT color="green">763</FONT> }<a name="line.763"></a>
767 <FONT color="green">764</FONT> <a name="line.764"></a>
768 <FONT color="green">765</FONT> /** Copy an array.<a name="line.765"></a>
769 <FONT color="green">766</FONT> * @param src source array<a name="line.766"></a>
770 <FONT color="green">767</FONT> * @param dest destination array<a name="line.767"></a>
771 <FONT color="green">768</FONT> */<a name="line.768"></a>
772 <FONT color="green">769</FONT> private static void copyArray(final double[] src, final double[] dest) {<a name="line.769"></a>
773 <FONT color="green">770</FONT> System.arraycopy(src, 0, dest, 0, src.length);<a name="line.770"></a>
774 <FONT color="green">771</FONT> }<a name="line.771"></a>
775 <FONT color="green">772</FONT> <a name="line.772"></a>
776 <FONT color="green">773</FONT> /** Copy an array.<a name="line.773"></a>
777 <FONT color="green">774</FONT> * @param src source array<a name="line.774"></a>
778 <FONT color="green">775</FONT> * @param dest destination array<a name="line.775"></a>
779 <FONT color="green">776</FONT> */<a name="line.776"></a>
780 <FONT color="green">777</FONT> private static void copyArray(final double[][] src, final double[][] dest) {<a name="line.777"></a>
781 <FONT color="green">778</FONT> for (int i = 0; i &lt; src.length; ++i) {<a name="line.778"></a>
782 <FONT color="green">779</FONT> copyArray(src[i], dest[i]);<a name="line.779"></a>
783 <FONT color="green">780</FONT> }<a name="line.780"></a>
784 <FONT color="green">781</FONT> }<a name="line.781"></a>
785 <FONT color="green">782</FONT> <a name="line.782"></a>
786 <FONT color="green">783</FONT> /** Write an array.<a name="line.783"></a>
787 <FONT color="green">784</FONT> * @param out output stream<a name="line.784"></a>
788 <FONT color="green">785</FONT> * @param array array to write<a name="line.785"></a>
789 <FONT color="green">786</FONT> * @exception IOException if array cannot be read<a name="line.786"></a>
790 <FONT color="green">787</FONT> */<a name="line.787"></a>
791 <FONT color="green">788</FONT> private static void writeArray(final ObjectOutput out, final double[] array)<a name="line.788"></a>
792 <FONT color="green">789</FONT> throws IOException {<a name="line.789"></a>
793 <FONT color="green">790</FONT> for (int i = 0; i &lt; array.length; ++i) {<a name="line.790"></a>
794 <FONT color="green">791</FONT> out.writeDouble(array[i]);<a name="line.791"></a>
795 <FONT color="green">792</FONT> }<a name="line.792"></a>
796 <FONT color="green">793</FONT> }<a name="line.793"></a>
797 <FONT color="green">794</FONT> <a name="line.794"></a>
798 <FONT color="green">795</FONT> /** Write an array.<a name="line.795"></a>
799 <FONT color="green">796</FONT> * @param out output stream<a name="line.796"></a>
800 <FONT color="green">797</FONT> * @param array array to write<a name="line.797"></a>
801 <FONT color="green">798</FONT> * @exception IOException if array cannot be read<a name="line.798"></a>
802 <FONT color="green">799</FONT> */<a name="line.799"></a>
803 <FONT color="green">800</FONT> private static void writeArray(final ObjectOutput out, final double[][] array)<a name="line.800"></a>
804 <FONT color="green">801</FONT> throws IOException {<a name="line.801"></a>
805 <FONT color="green">802</FONT> for (int i = 0; i &lt; array.length; ++i) {<a name="line.802"></a>
806 <FONT color="green">803</FONT> writeArray(out, array[i]);<a name="line.803"></a>
807 <FONT color="green">804</FONT> }<a name="line.804"></a>
808 <FONT color="green">805</FONT> }<a name="line.805"></a>
809 <FONT color="green">806</FONT> <a name="line.806"></a>
810 <FONT color="green">807</FONT> /** Read an array.<a name="line.807"></a>
811 <FONT color="green">808</FONT> * @param in input stream<a name="line.808"></a>
812 <FONT color="green">809</FONT> * @param array array to read<a name="line.809"></a>
813 <FONT color="green">810</FONT> * @exception IOException if array cannot be read<a name="line.810"></a>
814 <FONT color="green">811</FONT> */<a name="line.811"></a>
815 <FONT color="green">812</FONT> private static void readArray(final ObjectInput in, final double[] array)<a name="line.812"></a>
816 <FONT color="green">813</FONT> throws IOException {<a name="line.813"></a>
817 <FONT color="green">814</FONT> for (int i = 0; i &lt; array.length; ++i) {<a name="line.814"></a>
818 <FONT color="green">815</FONT> array[i] = in.readDouble();<a name="line.815"></a>
819 <FONT color="green">816</FONT> }<a name="line.816"></a>
820 <FONT color="green">817</FONT> }<a name="line.817"></a>
821 <FONT color="green">818</FONT> <a name="line.818"></a>
822 <FONT color="green">819</FONT> /** Read an array.<a name="line.819"></a>
823 <FONT color="green">820</FONT> * @param in input stream<a name="line.820"></a>
824 <FONT color="green">821</FONT> * @param array array to read<a name="line.821"></a>
825 <FONT color="green">822</FONT> * @exception IOException if array cannot be read<a name="line.822"></a>
826 <FONT color="green">823</FONT> */<a name="line.823"></a>
827 <FONT color="green">824</FONT> private static void readArray(final ObjectInput in, final double[][] array)<a name="line.824"></a>
828 <FONT color="green">825</FONT> throws IOException {<a name="line.825"></a>
829 <FONT color="green">826</FONT> for (int i = 0; i &lt; array.length; ++i) {<a name="line.826"></a>
830 <FONT color="green">827</FONT> readArray(in, array[i]);<a name="line.827"></a>
831 <FONT color="green">828</FONT> }<a name="line.828"></a>
832 <FONT color="green">829</FONT> }<a name="line.829"></a>
833 <FONT color="green">830</FONT> <a name="line.830"></a>
834 <FONT color="green">831</FONT> }<a name="line.831"></a>
835 <FONT color="green">832</FONT> <a name="line.832"></a>
836 <FONT color="green">833</FONT> /** Wrapper for event handlers. */<a name="line.833"></a>
837 <FONT color="green">834</FONT> private static class EventHandlerWrapper implements EventHandler {<a name="line.834"></a>
838 <FONT color="green">835</FONT> <a name="line.835"></a>
839 <FONT color="green">836</FONT> /** Underlying event handler with jacobians. */<a name="line.836"></a>
840 <FONT color="green">837</FONT> private final EventHandlerWithJacobians handler;<a name="line.837"></a>
841 <FONT color="green">838</FONT> <a name="line.838"></a>
842 <FONT color="green">839</FONT> /** State array. */<a name="line.839"></a>
843 <FONT color="green">840</FONT> private double[] y;<a name="line.840"></a>
844 <FONT color="green">841</FONT> <a name="line.841"></a>
845 <FONT color="green">842</FONT> /** Jacobian with respect to initial state dy/dy0. */<a name="line.842"></a>
846 <FONT color="green">843</FONT> private double[][] dydy0;<a name="line.843"></a>
847 <FONT color="green">844</FONT> <a name="line.844"></a>
848 <FONT color="green">845</FONT> /** Jacobian with respect to parameters dy/dp. */<a name="line.845"></a>
849 <FONT color="green">846</FONT> private double[][] dydp;<a name="line.846"></a>
850 <FONT color="green">847</FONT> <a name="line.847"></a>
851 <FONT color="green">848</FONT> /** Simple constructor.<a name="line.848"></a>
852 <FONT color="green">849</FONT> * @param handler underlying event handler with jacobians<a name="line.849"></a>
853 <FONT color="green">850</FONT> * @param n dimension of the original ODE<a name="line.850"></a>
854 <FONT color="green">851</FONT> * @param k number of parameters<a name="line.851"></a>
855 <FONT color="green">852</FONT> */<a name="line.852"></a>
856 <FONT color="green">853</FONT> public EventHandlerWrapper(final EventHandlerWithJacobians handler,<a name="line.853"></a>
857 <FONT color="green">854</FONT> final int n, final int k) {<a name="line.854"></a>
858 <FONT color="green">855</FONT> this.handler = handler;<a name="line.855"></a>
859 <FONT color="green">856</FONT> y = new double[n];<a name="line.856"></a>
860 <FONT color="green">857</FONT> dydy0 = new double[n][n];<a name="line.857"></a>
861 <FONT color="green">858</FONT> dydp = new double[n][k];<a name="line.858"></a>
862 <FONT color="green">859</FONT> }<a name="line.859"></a>
863 <FONT color="green">860</FONT> <a name="line.860"></a>
864 <FONT color="green">861</FONT> /** Get the underlying event handler with jacobians.<a name="line.861"></a>
865 <FONT color="green">862</FONT> * @return underlying event handler with jacobians<a name="line.862"></a>
866 <FONT color="green">863</FONT> */<a name="line.863"></a>
867 <FONT color="green">864</FONT> public EventHandlerWithJacobians getHandler() {<a name="line.864"></a>
868 <FONT color="green">865</FONT> return handler;<a name="line.865"></a>
869 <FONT color="green">866</FONT> }<a name="line.866"></a>
870 <FONT color="green">867</FONT> <a name="line.867"></a>
871 <FONT color="green">868</FONT> /** {@inheritDoc} */<a name="line.868"></a>
872 <FONT color="green">869</FONT> public int eventOccurred(double t, double[] z, boolean increasing)<a name="line.869"></a>
873 <FONT color="green">870</FONT> throws EventException {<a name="line.870"></a>
874 <FONT color="green">871</FONT> dispatchCompoundState(z, y, dydy0, dydp);<a name="line.871"></a>
875 <FONT color="green">872</FONT> return handler.eventOccurred(t, y, dydy0, dydp, increasing);<a name="line.872"></a>
876 <FONT color="green">873</FONT> }<a name="line.873"></a>
877 <FONT color="green">874</FONT> <a name="line.874"></a>
878 <FONT color="green">875</FONT> /** {@inheritDoc} */<a name="line.875"></a>
879 <FONT color="green">876</FONT> public double g(double t, double[] z)<a name="line.876"></a>
880 <FONT color="green">877</FONT> throws EventException {<a name="line.877"></a>
881 <FONT color="green">878</FONT> dispatchCompoundState(z, y, dydy0, dydp);<a name="line.878"></a>
882 <FONT color="green">879</FONT> return handler.g(t, y, dydy0, dydp);<a name="line.879"></a>
883 <FONT color="green">880</FONT> }<a name="line.880"></a>
884 <FONT color="green">881</FONT> <a name="line.881"></a>
885 <FONT color="green">882</FONT> /** {@inheritDoc} */<a name="line.882"></a>
886 <FONT color="green">883</FONT> public void resetState(double t, double[] z)<a name="line.883"></a>
887 <FONT color="green">884</FONT> throws EventException {<a name="line.884"></a>
888 <FONT color="green">885</FONT> dispatchCompoundState(z, y, dydy0, dydp);<a name="line.885"></a>
889 <FONT color="green">886</FONT> handler.resetState(t, y, dydy0, dydp);<a name="line.886"></a>
890 <FONT color="green">887</FONT> }<a name="line.887"></a>
891 <FONT color="green">888</FONT> <a name="line.888"></a>
892 <FONT color="green">889</FONT> }<a name="line.889"></a>
893 <FONT color="green">890</FONT> <a name="line.890"></a>
894 <FONT color="green">891</FONT> }<a name="line.891"></a>
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955 </PRE>
956 </BODY>
957 </HTML>