Pisson方程式

http://acm.pku.edu.cn/JudgeOnline/problem?id=2601
この問題、ただの漸化式的な問題に見えるけれども、実は1次元Poisson方程式を解く問題だったりする。
a_i = \frac{a_{i-1} + a_{i+1}}{2} - c_iっていうのはつまり、\frac{a_{i-1} - 2 a_i + a_{i+1}}{\Delta x^2} = \frac{2 c_i}{\Delta x^2}と書けるわけで。

そうすると、両端がディリクレ条件になっていると考えて、各点の2階微分が与えられているわけなので、2回積分してやればいい。より正確には、a1を求める問題なので、a'_{1/2}を求めてやればいい。

この場合の考え方としては、\frac{a_{i-1} - 2 a_i + a_{i+1}}{2 \Delta x} = \frac{\frac{a_{i+1} - a_{i}}{\Delta x} - \frac{a_{i} - a_{i-1}}{\Delta x}}{2 \Delta x}といった感じ。

これをコードに落とすとこうなる。

import java.util.*;

class Main{
	public static void main(String [] argv){
		Scanner scanner = new Scanner(System.in);
		double v = 0;
		int size = scanner.nextInt();
		double a0 = scanner.nextDouble();
		double anp1 = scanner.nextDouble();
		double a_dash = 0.0;
		for(int i = 0; i < size; i++){
			double ci = scanner.nextDouble() * 2;
			a_dash += ci;
			v += a_dash;
		}
		double a_dash1 = ((anp1 - a0) - v) / (size + 1);
		double a1 = a0 + a_dash1;
		System.out.printf("%.02f\n", a1);
	}
}

要は、積分定数を求める問題に帰着してしまうというわけ。細かい解説はしないので、適当によろしく。
普通に漸化式的にも解けるけれど、こういう考え方をするとそれはそれで趣き深い問題だよねん。