我正在尝试为特殊情况求解以下方程,其中l = b = 0;它应该返回完美的正方形函数的平方根,例如sqrt((x-d)^2)。这可以具有两种解决方案(X-D)或(D-X)。我想将(X-D)作为我的最终解决方案,但默认情况下的程序(D-X)解决方案。我尝试更改D和X的位置,但似乎无济于事。这是我的程序:
float y(float x) {
float l=0., b=0., d=8.5, r_0=3., z_0=0.1;
return exp(-pow(x*x*cos(b*PI/180.)*cos(b*PI/180.)+d*d-2*d*x*cos(b*PI/180.)*cos(l*PI/180.), 0.5)/r_0)*exp(-x*pow(1-cos(b*PI/180.)*cos(b*PI/180.),0.5)/z_0) ;
}
int main(){
FILE* fp =NULL;
float x0,xn,step,s,int_val, tau; /* s = distance to the star from the sun*/
int i,n, j ;
scanf("%f%f%d",&x0,&xn,&n);
step = (xn-x0)/n;
s = y(x0) + y(xn);
fp = fopen("trap.txt", "w");
for(i = 1; i < n; i++) {
s += 2*y(x0+i*step);
fprintf(fp,"%en",s*step/2);
}
fclose(fp);
我假设您正在为零件说话:
-pow( x*x*cos( b*PI / 180. )*cos( b*PI / 180. ) + d*d - 2 * d*x*cos( b*PI / 180. )*cos( l*PI / 180. ), 0.5 )
首先,首先,实际上有一个函数double sqrt( double x )
,用于计算平方根。
第二件事是,与数学息息相关,sqrt( square( anything ) )
将返回absolutevalue( anything )
。在您的示例情况下,sqrt( (x-d)^2 )
等于absolutevalue( x-d )
。由于absolutevalue( x-d )
等于absolutevalue( d-x )
,因此更改值的位置不会改变任何内容...
如果x > d
,则将评估为x - d
;否则对于d - x
,这就是数学所说的。
不是在变化的地方,但是您可以简单地在整个sqrt( square( ) )
的东西之前放一个负号,以改变其位置。您已经有一个负数,可以简单地删除。
知道正方形的平方根评估到绝对值,您还可以替换上面用fabs( x * cos( b * PI / 180. ) - d )
编写的特定提取物,其中 fabs
是获得double
绝对值的函数,并在math.h
中定义。
使用替换替换重复术语。使用选择常数,简化。
#include <math.h>
#define PI 3.1415926535897932384626433832795
float y(float x) {
float l=0., b=0., d=8.5, r_0=3., z_0=0.1;
double y;
// y = exp(-pow(x*x*cos(b*PI/180.)*cos(b*PI/180.)+d*d-2*d*x*cos(b*PI/180.)*cos(l*PI/180.), 0.5)/r_0)
// y *= exp(-x*pow(1-cos(b*PI/180.)*cos(b*PI/180.),0.5)/z_0);
if (l != 0.0 || b != 0.0) {
double xcosb = x*cos(b*PI/180.);
double xsinb = x*sin(b*PI/180.);
double cosl = cos(l*PI/180.);
// general solution
y = exp(-sqrt(xcosb*xcosb - 2*xcosb*d*cosl + d*d)/r_0);
y *= exp(-xsinb/z_0); // @abiessu
} else {
// y = exp(-sqrt(x*x - 2*x*d*1.0 + d*d)/r_0);
// y *= exp(-0/z_0);
// y = exp(-sqrt((x-d)*(x-d))/r_0);
// y *= 1.0;
y = exp(-fabs(x - d))/r_0;
}
return y;
}
这确实将(x-d)
作为最终解决方案。建议OP查看正确性的功能。