求助利用MATLAB进行复杂函数的定积分方法! 详情见补充,多谢了!

求助利用MATLAB进行复杂函数的定积分方法! 详情见补充,多谢了!,第1张

一、符号积分符号积分由函数int来实现。该函数的一般调用格式为:int(s):没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数或符号表达式s求不定积分;int(s,v):以v为自变量,对被积函数或符号表达式s求不定积分;int(s,v,a,b):求定积分运算。a,b分别表示定积分的下限和上限。该函数求被积函数在区间[a,b]上的定积分。a和b可以是两个具体的数,也可以是一个符号表达式,还可以是无穷(inf)。当函数f关于变量x在闭区间[a,b]上可积时,函数返回一个定积分结果。当a,b中有一个是inf时,函数返回一个广义积分。当a,b中有一个符号表达式时,函数返回一个符号函数。例:求函数x^2+y^2+z^2的三重积分。内积分上下限都是函数,对z积分下限是sqrt(xy),积分上限是x^2y;对y积分下限是sqrt(x),积分上限是x^2;对x的积分下限1,上限是2,求解如下:>>syms x y z %定义符号变量>>F2=int(int(int(x^2+y^2+z^2,z,sqrt(xy),x^2y),y,sqrt(x),x^2),x,1,2) %注意定积分的书写格式F2 = 1610027357/6563700-6072064/3480752^(1/2)+14912/46412^(1/4)+64/2252^(3/4) %给出有理数解>>VF2=vpa(F2) %给出默认精度的数值解VF2 = 22492153573331143159790710032805 二、数值积分1数值积分基本原理求解定积分的数值方法多种多样,如简单的梯形法、辛普生(Simpson)•法、牛顿-柯特斯(Newton-Cotes)法等都是经常采用的方法。它们的基本思想都是将整个积分区间[a,b]分成n个子区间[xi,xi+1],i=1,2,…,n,其中x1=a,xn+1=b。这样求定积分问题就分解为求和问题。2数值积分的实现方法基于变步长辛普生法,MATLAB给出了quad函数来求定积分。该函数的调用格式为:[I,n]=quad('fname',a,b,tol,trace) 基于变步长、牛顿-柯特斯(Newton-Cotes)法,MATLAB给出了quadl函数来求定积分。该函数的调用格式为:[I,n]=quadl('fname',a,b,tol,trace) 其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。例:求函数'exp(-xx)的定积分,积分下限为0,积分上限为1。>>fun=inline('exp(-xx)','x'); %用内联函数定义被积函数fname

>>Isim=quad(fun,0,1) %辛普生法Isim = 0746824180726425 IL=quadl(fun,0,1) %牛顿-柯特斯法IL = 0746824133988447 三、梯形法求向量积分trapz(x,y)—梯形法沿列方向求函数Y关于自变量X的积分(向量形式,数值方法)。>>d=0001; >>x=0:d:1; >>S=dtrapz(exp(-x^2)) S= 07468 或:>>format long g >>x=0:0001:1; %x向量,也可以是不等间距>>y=exp(-x^2); %y向量,也可以不是由已知函数生成的向量>>S=trapz(x,y); %求向量积分S = 0746824071499185 int的积分可以是定积分,也可以是不定积分(即有没有积分上下限都可以积)可以得到解析的解,比如你对x^2积分,得到的结果是1/3x^3,这是通过解析的方法来解的。如果int(x^2,x,1,2)得到的结果是7/3 quad是数值积分,它只能是定积分(就是有积分上下限的积分),它是通过simpson数值积分来求得的(并不是通过解析的方法得到解析解,再将上下限代入,而是用小梯形的面积求和得到的)。如果f=inline('x^2');quad(f,1,2)得到的结果是2333333,这个数并不是7/3 int是符号解,无任何误差,唯一问题是计算速度;quad是数值解,有计算精度限制,优点是总是能有一定的速度,即总能在一定时间内给出一个一定精度的解。[FROM: 58192116] 对于y=exp(-(x^2+x+1)/(1+x)),被积函数之原函数无"封闭解析表达式",符号计算无法解题,这是符号计算有限性,结果如下:>> syms x >>y=exp(-(x^2+x+1)/(1+x)) >>s=int(y,x,0,inf) y = exp((-x^2-x-1)/(1+x))

Warning: Explicit integral could not be found >> In symint at 58 s = int(exp((-x^2-x-1)/(1+x)),x = 0 Inf) 只有通过数值计算解法>> dx=005; %采样间隔>>x=0:dx:1000; %数值计算适合于有限区间上,取有限个采样点,只要终值足够大,精度不受影响>>y=exp(-(x^2+x+1)/(1+x)); >>S=dxcumtrapz(y); %计算区间内曲线下图形面积,为小矩形面积累加得>>S(end) ans = 05641 %所求定积分值或进行编程,积分上限人工输入,程序如下:%表达式保存为函数文件function y=fxy(x) y=exp(-(x^2+x+1)/(1+x)); % save fxym % main --------主程序clear,clc h=001;p=0;a=0; R=input('请输入积分上限,R=') while a<R p=p+(fxy(a)+fxy(a+h))h/2; a=a+h; end p=vpa(p,10) 运行主程序后得到结果:请输入积分上限,R=1000 R = 1000 p = 5641346055 其它结果如下:0-1: int=3067601686 0-2: int=4599633159 0-5: int=5583068217 0-10: int=5640928975 0-100: int=5641346055 0-1000: int=5641346055 [FROM: 2116533]

在积分函数中, sqrt(e1e2e3)cos(n1pix/12)cos(n2piy/11)cos(n3piz/9);已知变量e1,e2,e3,n1,n2,n3通过函数参数输入,如果直接用inline或字符串的形式,则表达式中的未知数有9个,分别是e1,e2,e3,n1,n2,n3,x,y,z。而用匿名函数时,已知变量e1,e2,e3,n1,n2,n3就会以常数看待,未知数就只有x,y,z了,可以求三重积分了。完整函数程序:function Fn(n1,n2,n3) if n1==0 e1=1; else if n1>0 e1=2; end end if n2==0 e2=1; else if n2>0 e2=2; end end if n3==0 e3=1; else if n3>0 e3=2; end end F=@(x,y,z)sqrt(e1e2e3)cos(n1pix/12)cos(n2piy/11)cos(n3piz/9); S=triplequad(F,-6,6,-55,55,-45,45) %求三重数值积分将以上代码保存为Fnm程序文件,即m文件,然后运行:>> Fn(1,1,1) S = 8669655 [FROM: 2116533] 三重积分请用三重积分函数triplequad,与三个积分上下限对应,即x=triplequad(F,-6,6,-55,55,-45,45)

其中被积函数F用"匿名函数"来表达,即F=@(x,y,z)sqrt(e1e2e3)cos(n1pix/12)cos(n2piy/11)cos(n3piz/9); 如果直接用inline或字符串的形式,则表达式中的未知数有9个,分别是e1,e2,e3,n1,n2,n3,x,y,z。而用匿名函数时,已知变量e1,e2,e3,n1,n2,n3就会以常数看待,未知数就只有x,y,z了。完整函数程序:function Fn(n1,n2,n3) if n1==0 e1=1; else if n1>0 e1=2; end end if n2==0 e2=1; else if n2>0 e2=2; end end if n3==0 e3=1; else if n3>0 e3=2; end end F=@(x,y,z)sqrt(e1e2e3)cos(n1pix/12)cos(n2piy/11)cos(n3piz/9); x=triplequad(F,-6,6,-55,55,-45,45) >> Fn(1,1,1) x = 8669655 [FROM: 58192116]

用c++编程代码如下:

#include<stdioh>

#include<stringh>

#include <mathh>

#include <iostreamh>

double F( double x)

{

return (xx+2x+1);

}

void main()

{

double x,a,b;

double A=0;//计算结果

double d;

int i,n;

cout<<"请输入a,b,n:"<<endl;

cin>>a>>b>>n;

d=(b-a)/n;

for(x=a;x<=b;x+=d)

{

A=A+(F(x)+F(x+d))d/2;

}

cout<<A;

}

#include<stdioh>

#include<mathh>

double f(double x)

{

return sqrt(4-xx);

}

main()

{

double a,b,s1,s2,s,h,m=1E-6;

int n,i;

printf("请输入积分下限a和积分上限b\n");

scanf("%lf%lf",&a,&b);

s2=0;

n=10000;

// do

{

s1=s2;

n=2n;

h=(b-a)/n;

i=1;

s2=0;

do

{

s=(f(a+ih)+f(a+(i-1)h))h/2;

s2=s2+s;

i=i+1;

}

while(i<=n);

}

// while((fabs(s1-s2))>(m(fabs(s2)-fabs(s1))));

printf("f(x)在[a,b]上的定积分为%10lf",s2);

return 0;

}

matlab编程求无穷限定积分:

用如下程序:

syms x

f = exp(-x^2);

int(f, x, 0, inf)

结果是pi^(1/2)/2,即2分之根号派

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。

它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。

MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。

MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。

MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C、FORTRAN等语言完成相同的事情简捷得多。

并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。

下面程序是求x平方在0-1积分的小例子,原理就是向一个定积分规定的区域内随机投入无数点,统计投入在函数曲线与坐标轴之间的点数比总点数乘此块区域面积就是积分。针对复杂积分,需要扩展的地方还是很多的,例如,函数不单调(统计总区域面积就麻烦多了),函数跨越上下象限(需要对坐标求下绝对值就可以)。

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

namespace Jifen

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            double jieguo = jifen(0, 1, ConvertToInt32(textBox1Text));//求0到1的积分,textBox1Text是投点个数,默认是999999就比较准确了

            textBox2Text = ConvertToString(jieguo);

        }

        private double jifen(int x, int y, int count)

        {

            double a;

            double b;

            int fenzi=0;

            Random rd = new Random();//随机对象

            for (int i = 0; i < count; i++)

            {

                a = x+(y-x)rdNextDouble();//得到随机投入的横坐标

                b = (y  y)  rdNextDouble();//得到随机投入的纵坐标

                if (b < a  a)//求x平方积分,这里判断投点是否在其函数曲线下面

                    fenzi++;//是的话计数

                

            }

            return (double)fenzi / count  (y - x)  (y  y);//落入函数曲线下面的点数比总点数乘此块区域面积就是积分

        }

    }

}

#include<stdioh>

void main()

{

double i,j;

double a,b,c=0;

printf("请输入积分上下限:");

scanf("%lf%lf",&a,&b);

for(i=a;i<=b;i+=10e-8)

{

j=ii+1;

j=10e-8;

c+=j;

}

printf("ans=%4f\n",c);

}

对了 没考虑自变量取负值的情况,这个程序只适合算上下限都大于零的情况。

以上就是关于求助利用MATLAB进行复杂函数的定积分方法! 详情见补充,多谢了!全部的内容,包括:求助利用MATLAB进行复杂函数的定积分方法! 详情见补充,多谢了!、用梯形法编程求函数f(x)=x2+2x+1的定积分、有关c语言用梯形法求定积分的一个程序,请帮忙修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9398734.html

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

发表评论

登录后才能评论

评论列表(0条)

保存