matlab写函数
子函数(.m)文件的格式
function [outarg1,outare2,...]=fname(inarg1,inarg2,...)
%function [输出量1,输出量2,...]=函数名(输入量1,输入量2,...)
[coding]
end
主函数调用的格式
[a,b,...]=fname(c,d,...);
%c,d,...是在主程序里面已经确定好的(也可以递归)输入的量
%然后把叫fname的函数看成一个黑箱子,向其中输入值后它会输出值,把输出值赋给a,b,...
一个简单的示例
使用ode
把n阶方程对应化成n元一阶方程组
以二阶方程为例:
ode的代码格式
%写表达那个一阶微分方程组的函数
function dy=FirstOrderODE(x,y)
%dy此时是一个列向量,dy的第一行是对应的y1',第二行是y2',...
%务必注意下面函数里面dy的表达!务必注意下面函数里面dy的表达!务必注意下面函数里面dy的表达!
%x就是你理解的那个x,y不用纠结,用y(1),y(2),...来表达y1,y2,...即可,用ode解,并不会要你去
写出y(1),y(2),...是啥,它就是解这个的[笑哭]
dy=[p(x,y(1),y(2),...);q(x,y(1),y(2),...);...];
%p(x,y(1),y(2),...)是指一个关于x,y(1),y(2),...的一个表达式,也就是代数方程组里面化出来的
y1'=p(x,y1,y2,...)的那个表达式
%注意有的运算加不加点点!!!(所谓元素群运算!!!) .* .^
%注意有的运算加括号确保运算顺序!!!
end
%主程序里调用ode
[x,y]=ode45('FirstOrderODE',[m,n],[y(m);y'(m);y''(m);...]);
%此处ode输出的x就是你编写函数时想要表达的那个x(其实也就是这里输的[0,20]的初值)
%此处ode输出的y就是你编写函数时想要表达的那个y,并且y(1)就是y1的一系列数值解,y(2)就是y2的
一系列数值解...
%[m,n]是人为输入的自变量的范围
%[y(m);y'(m);y''(m);...]是初值
一个小例题
俺去翻了一波高数PPT,找到了一个老师解出了解析解的二阶微分方程 (擅自转载一波,特此鸣谢高数老师和他的PPT [doge])
题目是这样的:
解析解是这样的:
下面,试试用ode解数值解!
先分析降次化简:
再编写函数
function dy = tryode(x,y)
dy=[y(2);((2.*x)./(1.+x.^2)).*y(2)];
主函数调用
[x,f]=ode45('tryode',[0,20],[1;3]);
plot(x,f(:,1)) %绘出y=f(x)的图像
图长这样:
和解析解对比验证一下叭!(上:数值解,下:解析解)
还可!
Emmmm,那今天就这样
2022.1.15