有关皮卡序列中的一个理解小错误

有关皮卡序列中的一个理解小错误

前言

皮卡序列的迭代式如下:
y n + 1 ( x ) = y 0 + ∫ x 0 x f ( x , y n ( x ) ) d x y_{n+1}\left( x \right) =y_0+\int_{x_0}^x{f\left( x,y_n\left( x \right) \right) dx} yn+1(x)=y0+x0xf(x,yn(x))dx
看似很容易实现,我有一个朋友,但是下面一串代码写的时候就没有注意,还想不明白!!!!!

问题代码

t=0;
for i=1:1:num
    y1(i)=integral(@(x) f(x,y0(i)),0,t);
    t=t+h;
end
t=0;
for i=1:1:num
    y2(i)=integral(@(x) f(x,y1(i)),0,t);
    t=t+h;
end
t=0;
for i=1:1:num
    y3(i)=integral(@(x) f(x,y2(i)),0,t);
    t=t+h;
end
t=0;
for i=1:1:num
    y4(i)=integral(@(x) f(x,y3(i)),0,t);
    t=t+h;
end
t=0;

问题原因

看似没有问题,但是其实后面是将y的部分直接乘以了积分区间,而非做积分。关键就在直接使用了y(i)上。

解决思路

这里写了一个新的数值积分函数,思路是在计算第一个皮卡序列的时候,已经确定了区间的长度,每一次迭代的次数其实也就对应着积分区间的数量,然后利用梯形积分即可得出结果:

function v=specialintegral(f,y,a,i,h)
    x=zeros(i,1);
    x(1)=a;
    ytemp=x;
    for j=2:1:i
        x(j)=h*j;
        ytemp(j)=f(x(j),y(j));
    end
    v=h/2*(ytemp(1)+ytemp(i));
    for j=2:1:i-1
        v=v+h/2*2*ytemp(j);
    end
end

最后得到的图像

在这里插入图片描述

题目完整代码

整个题目完整的代码:

clear;
clc;
close all;

f=@(x,y) x+y+1; 
h=0.001;
num=1/h;
y0=zeros(num,1);
x=linspace(0,1,num);
x=x';
y1=zeros(num,1);
y2=zeros(num,1);
y3=zeros(num,1);
y4=zeros(num,1);


t=0;
for i=1:1:num
    y1(i)=integral2(f,0,t,0,t);
    t=t+h;
end
for i=2:1:num
    y2(i)=specialintegral(f,y1,0,i,h);
end
for i=2:1:num
    y3(i)=specialintegral(f,y2,0,i,h);
end
for i=2:1:num
    y4(i)=specialintegral(f,y3,0,i,h);
end

plot(x,y1,LineWidth=1.5);
hold on;
plot(x,y2,LineWidth=1.5);
hold on;
plot(x,y3,LineWidth=1.5);
hold on;
plot(x,y4,LineWidth=1.5);
hold on;


ytemp=zeros(num,1);
ytemp(1)=0;
a=0;
for i=2:1:num
    a=a+h;
    ytemp(i)=ytemp(i-1)+h*f(a,ytemp(i-1));
end
plot(x,ytemp,LineWidth=1.5);
hold on
funthe=@(x) 2*exp(x)-x-2;
ythe=funthe(x);
plot(x,ythe,LineWidth=1.5);

legend('y1','y2','y3','y4','yEuler','ytheory');

%% speicial integral
function v=specialintegral(f,y,a,i,h)
    x=zeros(i,1);
    x(1)=a;
    ytemp=x;
    for j=2:1:i
        x(j)=h*j;
        ytemp(j)=f(x(j),y(j));
    end
    v=h/2*(ytemp(1)+ytemp(i));
    for j=2:1:i-1
        v=v+h/2*2*ytemp(j);
    end
end

题目:

在这里插入图片描述

写在最后

真服了,这一个bug折腾了快一个小时。。。。。。。。。。,写在这里,愿有缘人可以不被折磨

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值