求运用c++来实现复合梯形公式的代码

求运用c++来实现复合梯形公式的代码,第1张

复合梯形公式的C++代码:

#include<iostream>

#include<math.h>

using namespace std

double fun(double x)

{

     return (x*sin(x))  /*修改此处可以改变被积函数*/

}

double integral(double a, double b, int n)

{

     double sum,step,result

     int i

     sum=(fun(a)+fun(b))/2

     step=(b-a)/n /*积分步长*/

     for(i=1i<ni++)

      sum=sum+fun(a+i*step)

     result=sum*step

     return result/*返回积分值*/

}

void main() {

 double result

     result=integral(1.0,2.0,150)/*修改此处可以改变积分上下限和步长*/

     printf("result=%f\n",result)

 system("pause")

}

运行结果:

result=1.440418

main.m

g=@(t)exp(-t.^2)

x=linspace(0,5,100)

y1=zeros(1,100)

y2=zeros(1,100)

for i = 1:100

  y1(i)=2/sqrt(pi)*Simpson(g,0,x(i),1000) %幸普森公式

  y2(i)=2/sqrt(pi)*trapezoidal(g,0,x(i),1000)%复合梯形公式

end

plot(x,y1,'r-',x,y2,'b.')

legend('辛普森公式','复合梯形公式')

Simpson.m

function y = Simpson(f,a,b,M)

  % f被积函数;a积分下限;b积分上限;M子区间个数(将x分为多少个区间)

  h=(b-a)/(2*M)

  s1=0

  s2=0

  for i=1:M

      x=a+(2*i-1)*h

      s1=s1+f(x)

  end

  for j=1:(M-1)

      x=a+2*j*h

      s2=s2+f(x)

  end

  y=h/3*(f(a)+2*s2+4*s1+f(b)) 

end

trapezoidal.m

function y = trapezoidal(f,a,b,n)

  h=(b-a)/n

  x=zeros(1,n+1)

  F=zeros(1,n+1)

  for k=0:n

      x(k+1)=a+k*h

      if x(k+1)==0

          x(k+1)=10^(-10)

      end

  end

  T_1=h/2*(f(x(1))+f(x(n+1)))

  for i=2:n

      F(i)=h*f(x(i))

  end

  T_2 = sum(F)

  y =T_1+T_2

end

你这里错在调用自定义函数的时候不需要关键字function,将其去掉则不会有这个错误提示

不过看你的代码依旧存在问题:

f=int(fun,a,b)这一行要求fun为符号类型的变量,而你给的 fun=@(x)(x./sqrt(x.*x+9))却是函数句柄,那么这一句就会报错。

另外,这个代码试图通过int()积分得到精确值,然后比较数值积分的误差是否不超过0.5*10^-8,这就存在一个逻辑错误,如果这个被积函数不可积(这也正是采用数值积分的目的所在),那你就无法得到原函数进行判断了。所以正确的做法是比较两次计算值,如果两次计算值的误差小于0.5*10^-8,表明积分收敛了,这正是其计算精度。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7784760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存