24小时热门版块排行榜    

CyRhmU.jpeg
查看: 4730  |  回复: 12

匿名

用户注销 (小有名气)

本帖仅楼主可见
已阅   同方向广播   申请计算强帖   回复此楼   编辑   查看我的主页
回帖支持 ( 显示支持度最高的前 50 名 )

xcenxcen

银虫 (小有名气)

【答案】应助回帖


fegg7502: 金币+1, 应助指数+1, 鼓励交流 2014-05-13 09:17:07
function [y err] = soodesv(q1,q2,q3,alpha,beta,a,b,dx)
N = (b-a)/dx+1;
y = zeros(N,1);
D = zeros(N);
f = zeros(N,1);
for ir=1:N
    x = a+(ir-1)*dx;
    if ir==1
        D(ir,ir) = -q2(x)-2.0/(dx^2);
        D(ir,ir+1) = 2.0/(dx^2);
        f(ir) = 2.0*alpha/dx+q1(x)*alpha+q3(x);
    end
    if ir>1 && ir<N
        D(ir,ir) = -2.0/(dx^2)-q2(x);
        D(ir,ir+1) = 1.0/(dx^2)-q1(x)/(2.0*dx);
        D(ir,ir-1) = 1.0/(dx^2)+q1(x)/(2.0*dx);
        f(ir) = q3(x);
    end
    if ir==N
        D(ir,ir) = -q2(x)-2.0/(dx^2);
        D(ir,ir-1) = 2.0/(dx^2);
        f(ir) = q1(x)*beta+q3(x)-2.0*beta/dx;
    end
end
y = D\f;
t = a:dx:b;
err = norm(D*y-f);
fprintf('2rd order ode solver error: ||D*y-f||_{2}=%e\n',norm(D*y-f));
plot(t,y);

例子:
y''-3.0*y'+2.0*y-x=0 y'(0)=1 y'(1)=2
>>soodesv(@(x)3.0,@(x)(-2.0),@(x)x,1,2,0,1,0.01);
有限差分法 第二类边界条件
解的图像.jpg


有限差分法 第二类边界条件-1
结果.jpg

待我长发及腰,遮住一身肥膘。纵然虎背熊腰,也要高冷傲娇。
6楼2014-05-12 10:16:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

dbb627

荣誉版主 (著名写手)

【答案】应助回帖

★ ★ ★
感谢参与,应助指数 +1
fegg7502: 金币+3, 应助指数+1, 专家考核, 3ks 2014-05-13 09:16:37
这个可以考虑用bvp解算器做
BVP解算器
solinit = bvpinit(x, yinit, params)
sol = bvpsolver(odefun,bcfun,solinit,options)
由于边值问题可能有多解,为了便于我们确定那个解是我们需要的,所以必须使用bvpinit函数对初值进行估计
解算器(bvpsolver):Matlab中提供了bvp4c和bvp5c,后者误差控制更好些
输入参数:
x:需要计算的网格点,相当于ode**的tspan
yinit:猜测的值,可以是具体值,也可以是函数,类似与 ode**的 x0
params:其它未知参数,也是一个猜测值
odefun:描述边值问题微分方程的函数句柄

bcfun:边值函数,一般是双边值(x 的上下限即认为两个边界),但也支持多边值(具体看帮助)
bc(y(a),y(b))=0
举个例子,y(0)=0,y(4)=-2 ---bcfun可写成 res =@(ya,yb) [ ya(1) ; yb(1) + 2];
y'(0)=y'(pi)=0,y(0)=1-----------bcfun可写成res = @(ya,yb) [  ya(2); yb(2);ya(1)-1 ];
solinit:由bvpinit生成的初始化网格
solinit = bvpinit(linspace(pa,pb,10),[1 0]);
bvpinit的第一个参数表示求解域及中心节点,第二个参数表示猜测初始值,基本都写成[1 0],它的变化一般对解无影响
options:BVP解算器优化参数,可以通过bvpset设置,具体参数查看帮助

降阶法表达二阶的常微分方程,ya(1)表示函数在求解域[a,b]的左边界a上的值,ya(2)表示函数的一阶导数在a上的值,“ya(1)-5”实际上是“ya(1)-5=0”的简写,表示y(x=a)=5,即函数在左边界上的值为5。yb是右边界,其他与ya相同。
用bvp4c求得的解sol是一个结构体,其中的子项y是一个2行多列的矩阵,第一行表示函数值,第二行表示函数的导数。另一个子项yp也是一个2行多列的矩阵,第一行表示函数一阶导数值,第二行表示函数二阶导数值。用deval求出的y与sol.y相同
The more you learn, the more you know, the more you know, and the more you forget. The more you forget, the less you know. So why bother to learn.
2楼2014-05-09 19:47:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (小有名气)

本帖仅楼主可见
3楼2014-05-09 21:24:53
已阅   申请计算强帖   回复此楼   编辑   查看我的主页

dbb627

荣誉版主 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
478107371: 金币+60, ★★★★★最佳答案, 大神,请接受我的膝盖,分全是你一人儿的 2014-05-10 00:11:25
fegg7502: 金币+2, 应助指数+1, 专家考核, 3ks 2014-05-13 09:16:54
举个例子吧
y''-3y'+2y=x, y‘(0)=1,y’(1)=2
CODE:
%解析解
yy=dsolve('D2y-3*Dy+2*y=x','Dy(0)=1','Dy(1)=2','x');
x=0:0.01:1;hold on;plot(x,eval(yy),'bo')
%bvp 数值解
f1=@(x,y)[y(2);x-2*y(1)+3*y(2)];
solinit = bvpinit(linspace(0,1,20),[-1 1]);
f2=@(ya,yb)[ya(2)-1;yb(2)-2];
sol = bvp4c(f1,f2,solinit);
xint = linspace(0,1,25);
yint = deval(sol,xint);
hold on; plot(xint,yint(1,:),'rp-');

The more you learn, the more you know, the more you know, and the more you forget. The more you forget, the less you know. So why bother to learn.
4楼2014-05-09 21:51:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (小有名气)

本帖仅楼主可见
5楼2014-05-10 01:25:56
已阅   申请计算强帖   回复此楼   编辑   查看我的主页

匿名

用户注销 (小有名气)

本帖仅楼主可见
7楼2014-05-12 10:39:14
已阅   申请计算强帖   回复此楼   编辑   查看我的主页

xcenxcen

银虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-05-13 09:17:18
引用回帖:
7楼: Originally posted by 478107371 at 2014-05-12 10:39:14
大神,你这个是用什么方法写的代码,能不能稍微解释一下子...

内部网格用的二阶中心差分
(y(j+1)-2*y(j)+y(j-1))/(dx^2)-q1j*(y(j+1)-y(j-1))/(2*dx)-q2j*yj-q3=0
j=1,....,N-1
边界条件用的二阶中心差分,引入虚网格点
左边边界条件y1-y(-1))/(2.0*dx)=alpha
y(-1)=y1-2*alpha*dx
利用方程
(y(1)-2*y(0)+y(-1))/(dx^2)-q10*alpha-q20*y0-q3=0
把y(-1)带入到上式
每个网格点都有一个方程
然后形成一个(N+1)×(N+1)的方程组
Dy=f
解出来就完了
待我长发及腰,遮住一身肥膘。纵然虎背熊腰,也要高冷傲娇。
8楼2014-05-12 12:49:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (小有名气)

本帖仅楼主可见
9楼2014-05-12 19:05:12
已阅   申请计算强帖   回复此楼   编辑   查看我的主页

xcenxcen

银虫 (小有名气)

【答案】应助回帖


fegg7502: 金币+1, 应助指数+1, 3ks 2014-05-13 09:17:28
引用回帖:
9楼: Originally posted by 478107371 at 2014-05-12 19:05:12
边界条件也是二阶差分吗,是不是一阶差分?另外迭代过程呢?思路是不是用有限差分将二阶方程变成线性方程组,然后用的牛顿迭代法求解?...

边界条件也可以用二阶的差分啊,当然你也可以用一阶的。
这是个线性方程组吧,直接消元就可以解了。你这个方程规模也不大,还是一维的问题。
真要迭代可以考虑用Jacobi迭代什么的。
牛顿迭代法不是解非线性方程的吗?
待我长发及腰,遮住一身肥膘。纵然虎背熊腰,也要高冷傲娇。
10楼2014-05-13 08:31:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 478107371 的主题更新
信息提示
请填处理意见