2変数のニュートン法の数値計算例(Java) |
- プログラムソース
import java.io.*;
import java.util.*;
class Newton2
{
public static void main()
{
int n,max;
double x1,x2,c1,c2,det,eps;
String s;
n=0;
max=1000; //最大繰り返し回数
eps=1.0e-5; //精度
x1=x2=0.0;
Newton2 f=new Newton2();
System.out.println("初期値2つをスペースを空けて入力してください。");
try
{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
s=br.readLine();
StringTokenizer st=new StringTokenizer(s," ");
x1=Double.parseDouble(st.nextToken());
x2=Double.parseDouble(st.nextToken());
}
catch(Exception e)
{
System.out.println(e);
}
do
{
if(n>max)
{
System.out.println("解が求まりませんでした。");
break;
}
n++;
det=f.J11(x1,x2)*f.J22(x1,x2)-f.J12(x1,x2)*f.J21(x1,x2);
c1=-(f.J22(x1,x2)*f.f1(x1,x2)-f.J12(x1,x2)*f.f2(x1,x2))/det;
c2=-(-(f.J21(x1,x2)*f.f1(x1,x2)-f.J11(x1,x2)*f.f2(x1,x2)))/det;
x1+=c1;
x2+=c2;
} while (c1*c1+c2*c2 > eps);
System.out.println("解は" + x1 + "と" + x2 + "です。");
}
double f1(double x1,double x2)
{
return x1*x1+x2*x2-2.0;
}
double f2(double x1,double x2)
{
return x2-x1;
}
double J11(double x1,double x2)
{
return 2.0*x1;
}
double J12(double x1,double x2)
{
return 2.0*x2;
}
double J21(double x1,double x2)
{
return -1.0;
}
double J22(double x1,double x2)
{
return 1.0;
}
}
- プログラム実行結果
初期値2つをスペースを空けて入力してください。
5.0 5.0
解は1.0000000000107445と1.0000000000107445です。
Press any key to continue
ちなみに、x1 と x2 の初期値をうまく設定すれば、解 -1 と -1 も求まる。
|
|
|
|
|
|