日期:2014-05-18  浏览次数:20666 次

一个小程序问题。。。。
(x*cos(y)+1.89)*848=1000
x*sin(y)*848=1160
求x和y 求代码编写过程

------解决方案--------------------
用C#解三角方程,不是吧。
不过这个方程比较特殊,高中数学没忘的话倒是可以解。
因为方程可以化为
x*cos(y)=1000/848-1.89
x*sin(y)=1160/848
两边平方相加,左边就只剩下x^2了。然后再根据正余弦的符号规则就可以确定y。
用C#的代码写就是:
C# code

double x1 = Math.Sqrt(Math.Pow(1000.0/848.0-1.89, 2) + Math.Pow(1160.0/848.0, 2));
double y1 = Math.PI - Math.Asin(Math.Abs(1160.0/848.0/x));
还有
double x2 = -Math.Sqrt(Math.Pow(1000.0/848.0-1.89, 2) + Math.Pow(1160.0/848.0, 2));
double y2 = 2 * Math.PI - Math.Asin(Math.Abs(1160.0/848.0/x));

------解决方案--------------------
848(x·cos(y) + 1.89) = 1000
848·x·sin(y) = 1160

==>

x·cos(y) = - 602.72 / 848
x·sin(y) = + 1160.00 / 848

令 
a = - 602.72 / 848
b = + 1160.00 / 848

则有:

x·cos(y) = a
x·sin(y) = b

==>

x^2 · (cos(y))^2 + x^2 · (sin(y))^2 = a^2 + b^2

==> 

x^2 = a^2 + b^2

==> x = +/- sqrt(a^2 + b^2)

这样就得到x的正负两个值


然后求y:

1. 当x取正值时:

cos(y) < 0
sin(y) > 0

由此可知此时y在第二象限 ( Pi/2 < y < Pi )

2. 当x取负值时:

cos(y) > 0
sin(y) < 0

由此可知此时y在第四象限 ( 3·Pi/2 < y < 2·Pi )

用 arc sin 或者 arc cos (sin / cos 的反函数) 可以求得y值

注意,在数学上来讲,求得的不应该是一个y值,y应该是一个数列
这个数列以 (1)arc sin 或者 arc cos求得的y值, (2)以及此值以2Pi为周期获得的其它值 构成


具体的数值运算语句见2楼。