『壹』 用c語言實現辛普森法二重積分~!謝了 !
分函數
a,b 積分下上限,eps 精度。
#include<stdlib.h>
#include <math.h>
double fsimpf(double x)
{
return sin(x) ;
}
double fsimp(double a,double b,double eps)
{
int n,k;
double h,t1,t2,s1,s2,ep,p,x;
n=1; h=b-a;
t1=h*(fsimpf(a)+fsimpf(b))/2.0;
s1=t1;
ep=eps+1.0;
while (ep>=eps)
{
p=0.0;
for (k=0;k<=n-1;k++)
{
x=a+(k+0.5)*h;
p=p+fsimpf(x);
}
t2=(t1+h*p)/2.0;
s2=(4.0*t2-t1)/3.0;
ep=fabs(s2-s1);
t1=t2; s1=s2; n=n+n; h=h/2.0;
}
return(s2);
}
void main()
{
double a,b,eps,t;
a=0.0; b=3.141592653589793238; eps=0.0000001;
a definite integral by Simpson Method.
t=fsimp(a,b,eps);
printf("%e\n",t);
printf("\n Press any key to quit...");
getch();
}
另外,站長團上有產品團購,便宜有保證
『貳』 c語言求解二重積分,急求
你不如用matlab。
c語言可以參見數值計算方法的書,用二重積分定義求,表示∑∑f(x,y)的形式,構造循環。新浪共享上有這個演算法,可以下載
『叄』 c語言 編程二重積分能不能現將其中一個看做常數積分
(手打原創)
用數值積分
一、定積分且f(x)易求
就是比如a->b,積f(x) 可以表示成1/n*sum x: 1->n (f(x/n),在精讀允許的范圍內取一個合適大小的n,循環加實現
二重的就再來一次循環
二、f(x)容易展開成泰勒級數的
也容易積的,也好辦
三、f(x)可以表示成十幾個常見積分的和差形式,或者分式可以展開
也好辦
『肆』 高等數學中體積分可以轉化為面積分計算,請問用c語言怎麼編寫它的程序
看積分表達式: dS 是第一類曲面積分(對面積的~~) dydz, dzdx, dxdy 是第二類曲面積分(對坐標的~~)第二類曲面積分,會指定在那一側積分。計算都是化為 二重積分。1. 第一類: 積分曲面在某一坐標平面投影, 計算 dS2. 第二類: ∫∫ P(x,y,z) dydz, 積分曲面在yOz坐標平面投影, 化為二重積分時,考慮±, 其中 前側取正,後側取負; ∫∫Q(x,y,z) dzdx, 積分曲面在zOx坐標平面投影, 化為二重積分時,考慮±, 其中 右側取正,左側取負; ∫∫ R(x,y,z) dxdy, 積分曲面在xOy坐標平面投影, 化為二重積分時,考慮±, 其中 上側取正,下側取負;注意: 如果是閉合曲面,可以考慮利用 Gauss 公式,化為 三重積分。
『伍』 二重積分不加C可以嗎
這個沒有一定的過程,要看具體問題的時候再求的,因為不同的區域代表的上下限不一樣呀。
你可以把極坐標下的ρ,θ范圍先寫好,再把ρ,θ看成直角坐標系中橫坐標與縱坐標畫出對應的區域,再用普通的直角坐標系中的積分去求就可以了。
你只要用換無法就可得到了,令x=rcosθ,y=rsinθ,此時dxdy由Jacobi行列式求得的,具體見圖片。
『陸』 如何用C語言編輯二重積分程序別說廢話,謝謝~
這是清華出的C語言程序集中的程序,你只要把其中的bjpqfs換成是上下限的表達公式,把bjpqf換為被積函數就可以了
bjpg.h
#ifndef _bjpq_h_
#define _bjpq_h_
#include <math.h>
extern void bjpqfs(double x,double y[2]);//上下限
extern double bjpqf(double x,double y);//f(x,y)
double bjpq(double a,//x積分上限
double b,//x積分下限
double eps);//精度
#endif
bjpq.c
#include "bjpq.h "
static double pqgl(double x,double eps)
{
int m=1,n=1,k,l,j;
double b[10],h[10],y[2],hh,t1,t2,s0,yy,g,ep,s;
bjpqfs(x,y);
hh=y[1]-y[0];h[0]=hh;
t1=0.5*hh*(bjpqf(x,y[0])+bjpqf(x,y[1]));
s0=t1;b[0]=t1;ep=1.0+eps;
while((ep> =eps) && (m <=9))
{
t2=0.5*t1;
for(k=0;k <n;k++)
{
yy=y[0]+(k+0.5)*hh;
t2+=0.5*hh*bjpqf(x,yy);
}
m++;
h[m-1]=h[m-2]/2.0;
g=t2;l=0;
for(j=2;j <=m;j++)
{
s=g-b[j-2];
if(!l)
if(fabs(s)+1.0==1.0)
l=1;
else g=(h[m-1]-h[j-2])/s;
}
b[m-1]=g;
if(l) b[m-1]=1.0e+35;
s=b[m-1];
for(j=m;j> =2;j--) s=b[j-2]-h[j-2]/s;
ep=fabs(s-s0)/(1.0+fabs(s));
n*=2;t1=t2;s0=s;hh=0.5*hh;
}
return s;
}
double bjpq(double a,double b,double eps)
{
int m=1,n=1,k,l,j;
double bb[10],h[10],hh,s1,s2,t1,t2,x,g,s0,ep,s;
hh=b-a;h[0]=hh;
s1=pqgl(a,eps);
s2=pqgl(b,eps);
t1=hh*(s1+s2)/2.0;
s0=t1;bb[0]=t1;ep=1.0+eps;
while((ep> =eps)&&(m <=9))
{
t2=0.5*t1;
for(k=0;k <n;k++)
{
x=a+(k+0.5)*hh;
s1=pqgl(x,eps);
t2+=0.5*s1*hh;
}
m++;
h[m-1]=h[m-2]/2.0;
g=t2;l=0;
for(j=2;j <=m;j++)
{
s=g-bb[j-2];
if(!l)
if(fabs(s)+1.0==1.0) l=1;
else g=(h[m-1]-h[j-2])/s;
}
bb[m-1]=g;
if(l) bb[m-1]=1.0e+35;
s=bb[m-1];
for(j=m;j> =2;j--) s=bb[j-2]-h[j-2]/s;
ep=fabs(s-s0)/(1.0+fabs(s));
n*=2;t1=t2;s0=s;hh/=2.0;
}
return s;
} main.c
#include "bjpq.h "
void bjpqfs(double x,double y[2])
{
y[1]=sqrt(1.0-x*x);
y[0]=-y[1];
return;
}
double bjpqf(double x,double y)
{
return exp(x*x+y*y);
}
main()
{
double xstart,xend,eps,s;
xstart=0.0;xend=1.0;eps=0.00005;
s=bjpq(xstart,xend,eps);
printf( "s=%e\n ",s);
}
『柒』 求C語言或者MATLAB對下面這個二重積分編程。
如果是2011b或更早的版本(至少2007b,否則無法處理為積分限為無窮的情況),可以藉助於匿名函數和arrayfun進行計算(dblquad不能接受quadgk方法,否則可以用dblquad):
>>m=0.7;n=0.8;
>>N=50;
>>f=@(x,p)sqrt(N/(2*pi*p*(1-p)))*exp(-N*(x-p).^2/(2*p*(1-p)));
>>quadl(@(P)arrayfun(@(p)quadgk(@(x)f(x,p),-inf,m),P),m,n)
ans=
0.0229
對於2012a之後的版本,可以用integral2計算:
>>m=0.7;n=0.8;
>>N=50;
>>f1=@(x,p)sqrt(N./(2*pi*p.*(1-p))).*exp(-N*(x-p).^2./(2*p.*(1-p)));
>>integral2(f1,-inf,m,m,n)
ans=
0.0229
『捌』 用c語言求二重積分~~
這個你用手工積分就行了,當然常數的代入計算還是可以用計算器的。給你的提示是分0<y<a/2和a/2<y<a兩次脫絕對值符號,最後都會演變為對sqrt(x^2+u^2)/(x^2+u^2+v^2)^2的積分形式,或者,你只關心數值結果的話,直接採用矩形法或者辛普森積分法,劃分的細一點就不會有太大誤差了
『玖』 求C語言求多重定積分的代碼
變步長梯形求定積分代碼如下:
#include
#include
#include
#define e 2.7182818
double f(double x)
{
return pow(e,x)*x*x; // 函數x^2 * e^x
}
double Calc(double a,double b,double esp)//變步長梯形求[a,b]定積分,esp是精度
{
int done(0);
int n=1;
double h,Tn,T2n,k,temp,x;
h=b-a;
Tn=h*(f(a)+f(b))/2.0;
while(!done)
{
temp = 0;
for(k=0;k
『拾』 如何用C語言求二重定積分
按二重積分的定義做。
我的這個出錯,一起討論下吧:
#include<stdio.h>
#include<math.h>
#defineN100
voidmain(){
doubleresult,(*p)(double,double);
doublef(double,double);
doubleintegral(double,double,double,double,double(*p)());
p=f;
// printf("請輸入abcd的值: ");
// scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
result=integral(2.0,8.0,0,6.0,p);
printf("該二重積分的值為: ");
printf("%f",result);
printf(" ");
}
//求二重積分的函數
doubleintegral(doublea,doubleb,doublec,doubled,double(*p)(double,double)){
inti,j;
doublex,y,h1,h2,volum=0;
h1=(b-a)/N;
h2=(d-c)/N;
x=a;
y=c;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
volum+=(*p)(x,y)*h1*h2;
y+=h2;
}
x+=h1;
}
return(volum);
}
doublef(doublex,doubley){
doubleh;
h=sqrt((2+x*x)*sin(x*y)*sin(x*y))+x*x*y*cos(x)-30*x*y*y;
return(h);
}
運行結果: