1.之前讨论过利用牛顿一元迭代公司可以求解一元方程,本文档介绍如何求解二元方程组
在有些需要进行复杂计算的程序中我们有可能需要求解复杂的二元方程 (如建筑学程序)
假设存在如下方程组:
xy -e^x + e^y -4 =0
xe^y -sin(xy) = 0
则有:
f'x = y - e^x (f(x,y) = xy -e^x + e^y -4 关于x的偏导数 )
f'y = x + e^y(f(x,y) = xy -e^x + e^y -4 关于y的偏导数 )
g'x = e^y - ycos(xy) (g(x,y) = xe^y -sin(xy) 关于x的偏导数 )
g'y = xe^y - xcos(xy) (g(x,y) = xe^y -sin(xy) 关于x的偏导数 )
带入迭代公式 :
fgy- gfy|(x, y) = f(x,y)g'y - g(x,y)f'y = (xy -e^x + e^y -4)*(xe^y - xcos(xy)) - (xe^y -sin(xy))*(x + e^y)
g'xf'x - f'xg'y|(x, y)= (e^y - ycos(xy) )*(x + e^y) - (y - e^x)*(xe^y - xcos(xy))
gf'x - fg'x|(x, y) = g(x,y)f'x - f(x,y)g'x = (xe^y -sin(xy) )*(y - e^x ) - (xy -e^x + e^y -4)*(e^y - ycos(xy))
java 代码如下:
public static void main(String[] args) { double x = 1.0, y = 1.0; String fxy = "xy -e^x + e^y -4"; String gxy = "xe^y -sin(xy)"; double accuracy = 0.5; // 精度 精度过高时,double会溢出 while (Math.abs(x*y - Math.pow(Math.E, x) + Math.pow(Math.E, y)-4) > accuracy || Math.abs(x* Math.pow(Math.E, y) - Math.sin(x*y)) > accuracy ){ // fgy- gfy|(x, y) = f(x,y)g'y - g(x,y)f'y = (xy -e^x + e^y -4)*(xe^y- xcos(xy)) - (xe^y -sin(xy))*(x + e^y) // // g'xf'x - f'xg'y|(x, y)= (e^y - ycos(xy))*(x + e^y) - (y - e^x)*(xe^y- xcos(xy)) // // gf'x - fg'x|(x, y) = g(x,y)f'x -f(x,y)g'x = (xe^y -sin(xy) )*(y - e^x ) - (xy -e^x + e^y -4)*(e^y - ycos(xy)) x = ((x*y -Math.pow(Math.E, x) + Math.pow(Math.E, y) -4) * (x* Math.pow(Math.E, y) - x * Math.cos(x * y)) - (x* Math.pow(Math.E, y) -Math.sin(x*y))*(x + Math.pow(Math.E, y)) ) / ((Math.pow(Math.E, y) - y* Math.cos(x * y)) * (x + Math.pow(Math.E, y)) - (y - Math.pow(Math.E, x))*(x * Math.pow(Math.E, y)- x * Math.cos( x * y))); y = ((x*Math.pow(Math.E, y) -Math.sin(x*y) )*(y - Math.pow(Math.E, x) ) - (x*y -Math.pow(Math.E, x) + Math.pow(Math.E, y)-4)*(Math.pow(Math.E, y) - y* Math.cos(x*y))) / ((Math.pow(Math.E, y) - y* Math.cos(x * y)) * (x + Math.pow(Math.E, y)) - (y - Math.pow(Math.E, x))*(x * Math.pow(Math.E, y)- x * Math.cos( x * y))); } System.out.println(x); System.out.println(y); System.out.println(x*y - Math.pow(Math.E, x) + Math.pow(Math.E, y)-4); System.out.println(x* Math.pow(Math.E, y) - Math.sin(x*y)); }
运行结果:
-3.6026863956355135
-1.1622735456336708
0.47283093757503547
-0.2615446960095503