Check the image 这是我的第一篇文章,所以在阅读我的问题时请记住这一点。 我参加了一次座谈会的考试,但我的代码没有提供正确的结果。 所以,如果有人能帮助我那将是伟大的。 :) 这些是考试中提供的信息: 函数 y = f(x)= ax ^ 2 + bx + c 我们必须找到图表下方的表面,但请记住dx(Delta X)= B-A,高度如下:A,A + dx,A + 2dx,....,B-dx。 随着dx值变低,表面将更准确。 你必须编写程序,使表面精度为0.001 这是我的代码,所以C好的人可以检查一下。 谢谢。
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c;
double A,B,dx,p,D,q,x,y,nv,nv1,nv2,sv;
do{
printf("Insert a & b: "),scanf("%lf %lf",&A,&B);
} while(A<1 || B<1);
nv=dx=B-A;
do{
printf("enter odds: "),scanf("%d %d %d",&a,&b,&c);
p=(-b)/2;
D=sqrt(pow(b,2)-4*a*c);
q= -D/4*a;
} while( a<0 || p<0 || q<0);
do{
sv=nv;
dx/=2;
nv=0;
for(x=A;x<p;x+=dx)
for(dx=B-A;dx<q;dx/=2)
nv1+=x*dx;
for(y=p;y<=B;y+=dx)
for(dx=q;dx<B;dx/=2)
nv2+=y*dx;
nv=nv1+nv2;
}while(fabs(nv-sv)>0.001);
printf("The surface is %lf",nv);
return 0;
}
答案 0 :(得分:0)
您想要找到二次函数的定积分的近似值。您的代码存在以下几个问题:
A≥1和B≥1的限制是什么?在整个横坐标上定义抛物线。如果有的话,你应该强制输入是数字并且给出了两个值。
您不需要找到抛物线的顶点。您的任务是根据图像显示的每个间隔的左 x 值创建小矩形。因此,您不需要 p 和 q 。并且您不应该强制执行顶点在输入的第一个象限中而没有指示。
为什么抛物线整数的系数?让他们double
保持一致。
因为您不需要知道顶点,所以您不需要将循环分成两部分。在您的代码中,您甚至不会检查 p 是否位于 A 和 B 之间,这是cour代码的要求。< / p>
内循环是什么?你应该在这里计算当前矩形的面积。更糟糕的是:您重复使用变量dx
作为迭代变量,这意味着您将其作为当前间隔大小的指标而丢失。
当间隔数量很大时,dx
的重复递增可能会导致累积的浮点错误。避免这种情况的常用技术是使用整数变量进行循环控制,并通过乘法确定实际的浮点变量。
作为收敛标准的绝对值可能导致小数和大数的问题。对于小值,迭代结束得太早,并且它可能永远不会达到大数的标准,其中0.001的差异无法解决。
这是您的代码版本,将所有这些付诸实践:
#include <stdio.h>
#include <math.h>
int main()
{
double a, b, c;
double A, B;
printf("Lower and upper limit A, B: ");
scanf("%lf %lf", &A, &B);
printf("enter coefficients a, b, c: ");
scanf("%lf %lf %lf", &a, &b, &c);
double nv = 0;
double sv;
int n = 1;
do {
int i;
double dx;
sv = nv;
n *= 2;
dx = (B - A) / n;
nv = 0;
for (i = 0; i < n; i++) {
double x = A + i * (B - A) / n;
double y = a*x*x + b*x + c;
nv += dx * y;
}
} while(fabs(nv - sv) > 0.0005 * fabs(nv + sv));
printf("Surface: %lf\n", nv);
return 0;
}
代码表现良好的空间隔(其中 A = B )或反向间隔(其中 A &gt; 乙)。 inpt仍然快速而肮脏。应该确实输入的值是有效数字。但是,没有必要任意限制输入。