Matlab 版 (精华区)

发信人: hahn (有奇☆闭关造文中), 信区: Matlab
标  题: [合集] Matlab解微分方程问题求助
发信站: 哈工大紫丁香 (Tue Nov 14 07:34:10 2006), 站内

────────────────────────────────────────
  COWOO (蔚蓝的风)                 于  (Mon Jun  5 21:17:36 2006)  说道:

高中同学让帮忙算个方程画个图,好就没摸Matlab了,微分方程也不太熟,不知道什么问
题。

同学给的题目如下:

边界条件:

r=0,ds/dr=0
r=R,s=5    

第二个边界条件也可以是ds/dr=无穷大 其中m,n,h都是常数 你可以取的 你先随便取 看
看画出来的图怎么样.

微分方程:

<img src="http://blog.cs.hit.edu.cn/function.png"/>

其中r的范围是0到0.00225,s的范围是0到5

我的解法:

用龙格库塔方法,把这个方程化成方程组,并在写成一个叫srfun.m的函数

function zhangfan=srfun(r,x);
global m
global n
global h
zhangfan=[x(2);m*x(1)*exp(-n*r)+h*x(1)-2*x(2)/r]

然后在matlab中调用:

global m;
m=1;
global n;
n=1;
global h;
h=1;

[r,s]=ode23('srfun',[0 0.00225],[2 0]);

结果算出来s除了第一组值是[2 0],其余全部是NaN。

我认为可能出错的地方:

   1. 微分方程化错了,好久没动微分方程了,化错了大家不要笑话我,呵呵
   2. 初值[2 0]选的不对。请高手指点这个问题怎么选这个参数?
   3. 还有一个可能,就是r的范围太小,数量级相差太大,但是我把[0 0.00225]换成
[0 2.25] 还是一样效果,我不知所措了。。。 

望高手指点一二。 


────────────────────────────────────────
  zjliu (秋天的萝卜)               于  (Mon Jun  5 21:53:49 2006)  说道:

Example:

% 二分法+打靶法解微分方程
% 方程:
%  diff(s,2)+2*diff(s,1)=m*s*exp(-n*r)+h*s,
%    where diff is a difference for r.
% 边界条件:

% r=0,ds/dr=0
% r=R,s=5
clc;clear;close all;
m=1;
n=1;
h=1;
R=5;
fun=inline('[s(2);m*s(1)*exp(-n*r)+h*s(1)-2*s(2)/r]',...
    'r','s','flag','m','n','h');
s_end=5;
sp=1;
rsa=0.1;
rsb=1;
d=1;
[r1,s1]=ode45(fun,[eps,R],[rsa;0],[],m,n,h);
[r2,s2]=ode45(fun,[eps,R],[rsb;0],[],m,n,h);
figure;
subplot(121);
plot(r1,s1(:,1));hold on;
plot(r2,s2(:,1),'r');
legend('for rsa','for rsb',0);
xlim([0,R]);
tg=title(['rsa=',num2str(rsa),',  rsb=',num2str(rsb)]);
subplot(122);
pa=plot(r1,s1(:,1));hold on;
pb=plot(r2,s2(:,1),'r');
pc=plot(r2,s2(:,1)*0.6,'k');
legend('for rsa','for rsb',0);
xlim([0,R]);
tg=title(['rsa=',num2str(rsa),',  rsb=',num2str(rsb)]);
while abs(s1(end,1)-s2(end,1))>1e-4; % 控制精度
    [r1,s1]=ode45(fun,[eps,R],[rsa;0],[],m,n,h);
    [r2,s2]=ode45(fun,[eps,R],[rsb;0],[],m,n,h);
    rs=[rsa+rsb]/2;
    [r,s]=ode45(fun,[eps,R],[rs;0],[],m,n,h);
    if s(end,1)>5;   % 二分法部分
        rsb=rs;
    else
        rsa=rs;
    end
    set(pc,'XData',r,'YData',s(:,1));
    set(tg,'string',['rs=',num2str(rs)]);
    pause(0.2);
end
title(['This program is over!'])

【 在 COWOO (蔚蓝的风) 的大作中提到: 】
: 高中同学让帮忙算个方程画个图,好就没摸Matlab了,微分方程也不太熟,不知道什么问
: 题。
: 同学给的题目如下:
: ...................



────────────────────────────────────────
  COWOO (蔚蓝的风)                 于  (Mon Jun  5 22:18:50 2006)  说道:

这么快!真是太感谢了。
赞一个!
【 在 zjliu (秋天的萝卜) 的大作中提到: 】
: Example:
: % 二分法+打靶法解微分方程
: % 方程:
: %  diff(s,2)+2*diff(s,1)=m*s*exp(-n*r)+h*s,
: %    where diff is a difference for r.
: % 边界条件:
: % 
: % r=0,ds/dr=0
: ...................





────────────────────────────────────────
  feifeifool (爱芳)                于  (Tue Jun  6 09:52:48 2006)  说道:

去处m*s*exp(-r)*s,是个欧拉方程,是有解析解的.
不知道这个变系数的项,能不能用常数变异法求解出来,有理论学过常微分的同学能不能执教一下.
【 在 COWOO (蔚蓝的风) 的大作中提到: 】
: 高中同学让帮忙算个方程画个图,好就没摸Matlab了,微分方程也不太熟,不知道什么问
: 题。
: 同学给的题目如下:
: ...................



────────────────────────────────────────
  zjliu (秋天的萝卜)               于  (Tue Jun  6 10:13:19 2006)  说道:

你说的欧拉方程,计算它的本征值方程就可以计算了
【 在 feifeifool (爱芳) 的大作中提到: 】
: 去处m*s*exp(-r)*s,是个欧拉方程,是有解析解的.
: 不知道这个变系数的项,能不能用常数变异法求解出来,有理论学过常微分的同学能不能执教一下.




[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.041毫秒