Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在matlab/mathematica中对不定积分进行数值计算,但不能用符号表示_Matlab_Wolfram Mathematica - Fatal编程技术网

在matlab/mathematica中对不定积分进行数值计算,但不能用符号表示

在matlab/mathematica中对不定积分进行数值计算,但不能用符号表示,matlab,wolfram-mathematica,Matlab,Wolfram Mathematica,我试图在Matlab和Mathematica中计算一个函数的积分,而这个软件不能象征性地完成 这是到目前为止我的MatLab代码,但我知道它可能没有多大帮助 f = @(t) asin(0.5*sin(t)); a = @(t) sin(t); F = int(f,t) % Matlab can't do this F = int(asin(sin(t)/2), t) A = int(a,t) % This works A = -cos(t) dt = 1/(N-1); % some

我试图在Matlab和Mathematica中计算一个函数的积分,而这个软件不能象征性地完成

这是到目前为止我的MatLab代码,但我知道它可能没有多大帮助

f = @(t) asin(0.5*sin(t));
a = @(t) sin(t);
F = int(f,t)   % Matlab can't do this
F = 
int(asin(sin(t)/2), t)
A = int(a,t)   % This works
A =
-cos(t)

dt = 1/(N-1); % some small number
for i=1:N
    F(i) = integral(f,(i-1)*dt,i*dt);
    A(i) = integral(a,(i-1)*dt,i*dt);
end
for循环中的两个计算给出了
f
a
的粗略近似值,而不是它们乘以
dt
后的积分

在数学堆栈交换中,我发现了一个类似于有限差分的方法,可以在某一点上导出积分。然而,当我在Matlab中进行计算时,它输出了一个缩小版的
f
,这在绘图后很明显(我所说的缩小的意思见上文)。我认为这是因为对于较小的区间,积分基本上以不同的精度近似函数(再次参见上文)

我试图得到一个积分的符号方程,或者函数在每个位置的积分的近似值

所以我的问题是,如果我有一个函数f,MatLab和Mathematica很难对它进行积分

  • 除了默认的积分计算器外,我可以直接用积分计算器近似积分吗?
    int
    integral
    trapz
  • 我可以先用有限差分近似函数,然后用符号计算积分吗?

  • 你的代码很好只是

    for i=1:N
        F(i) = integral(f,0,i*dt);
    end
    
    你也可以这样做

    F(1)=integral(f,0,dt)
    for i=2:N
        F(i) = F(i-1)+integral(f,(i-1)*dt,i*dt);
    end
    
    第二种选择肯定更有效

    因为原语实际上是F(x)=int(F(x),0,x)(0定义了一个常数),对于足够小的dx,你已经证明了F(x)=int(F(x),x,x+dx)/dx i。您已经证明了MATLAB intégral函数的作用

    例如,让我们假设=如果您希望计算,上面的函数将进行计算,只需将上面的0替换为您喜欢的常量
    a


    现在你应该得到包含离散化的
    F
    ,一般来说,公认的答案是目前为止最好的方法,我会说,但是如果函数的某些限制是允许的,那么还有第二种方法

    有关两个功能
    f
    g
    的信息,请参见下文

    T = 1;  % Period
    NT = 1;  % Number of periods
    dt = 0.01; % time interval
    time = 0:dt:NT*T;  % time
    
    syms t
    x = K*sin(2*pi*t+B);   % edit as appropriate
    
    % f = A/tanh(K)*tanh(K*sin(2*pi*t+p))
    % g = A/asin(K)*asin(K*sin(2*pi*t+p))
    
    找到的公式

    MATLAB可以计算n为整数时的sin^n(t)

    F = int(f,t);
    phi = double(subs(F,t,time));
    
    G = int(g,t);
    psi = double(subs(G,t,time));
    

    “除了默认解算器”是什么意思?您将什么划分为默认解算器?为什么您认为它们不起作用?最简单的数值积分器是Matlab中的trapz,为什么不能工作?如果你的极限是不确定的(在这种情况下你不能用数字计算任何东西),你的预期输出是什么?我解释了为什么它们不起作用,积分间隔太小,除了你输入计算器的函数外,不能输出任何东西。请包括一个。我们无法运行您当前的代码来生成您得到的任何非结果,您也没有建议预期的输出可能是什么。你能举一个被积函数可以进行代数积分的例子,这样我们就可以验证结果了吗?我不知道你为什么不能按照提供的那样运行代码,这并不困难。但我做了一些编辑,这应该会让你更容易。我知道
    int
    “做得很好”。也许我的方法是错误的,但是如果我积分f(x),积分应该像一个变换。函数不是指数函数,因此f(x)不等于int(f,x)。您是否尝试过修复我的问题(将(i-1)dt替换为0)?我只是说f(x)=int(f(x),x,x+dx)/dx,当dx到zéro时,这就是你在没有固定点的情况下观察到的。不,我没有,但原因是我想移动积分的区间。从
    0:dt
    ,到
    T-dt:T
    。有道理吗?我等会再试试,谢谢。我暂时不能回答。谢谢你最终接受了这个答案。明天我将删除我的评论。
    N = 60;
    for k=2:N
        a1 = (2^(2*k)-1)*2^(2*k)*bernoulli(2*k)/factorial(2*k);
        f = f + A1/tanh(K1)*a1*x^(2*k-1);
    
        a2 = factorial(2*k)/(2^(2*k)*factorial(k)^2*(2*k+1));
        g = g + A2/asin(K2)*a*x^(2*k+1);
    end
    
    F = int(f,t);
    phi = double(subs(F,t,time));
    
    G = int(g,t);
    psi = double(subs(G,t,time));