matlab - 我如何输入一个函数并在句柄函数中使用它
问题描述
在此代码中,用户输入 ODE 的系数,并且当所有系数都是数字代码时工作正常,但我想输入 f 作为函数,如 sin(2*t),如何输入 f 以在 z2perim 函数中使用它?
我尝试输入 f 作为句柄函数并使用符号它不能解决问题
clc; clear; close all;
disp('A Differential Equation look like:');
disp('ay"+by''+cy=f(t)');
disp('if your variables are time variant, please enter after @(t) as function handle!')
disp('Enter your Coefficients');
a=input('a= ');
b=input('b= ');
c=input('c= ');
f=input('f= ');
disp('Enter your T limiation (enter in this way: [start,end])= ')
t_input=input('');
disp('Enter y(0) condition= ');
y0_input=input('');
disp('Enter y''(0) condition= ');
ydot0_input=input('');
disp('Enter your desirable error= ');
error=input('');
h=nthroot(error,4);
t=t_input(1):h:t_input(2);
n=length(t);
z1perim = @(z1,z2,t) z2;
z2perim = @(z1,z2,t) -((c/a)*z1)-((b/a)*z2)+((1/a)*f);
z1=zeros(n,1);
z2=zeros(n,1);
z1(1)=y0_input;z2(1)=ydot0_input;
for ii = 1:n-1
k1=z1perim(z1(ii),z2(ii),t(ii));
l1=z2perim(z1(ii),z2(ii),t(ii));
k2=z1perim(z1(ii)+(h*k1/2),z2(ii)+(h*l1/2),t(ii)+h/2);
l2=z2perim(z1(ii)+(h*k1/2),z2(ii)+(h*l1/2),t(ii)+h/2);
k3=z1perim(z1(ii)+(h*k2/2),z2(ii)+(h*l2/2),t(ii)+h/2);
l3=z2perim(z1(ii)+(h*k2/2),z2(ii)+(h*l2/2),t(ii)+h/2);
k4=z1perim(z1(ii)+(h*k3),z2(ii)+(h*l3),t(ii)+h);
l4=z2perim(z1(ii)+(h*k3),z2(ii)+(h*l3),t(ii)+h);
z1(ii+1)=z1(ii)+(k1+2*k2+2*k3+k4)*h/6;
z2(ii+1)=z2(ii)+(l1+2*l2+2*l3+l4)*h/6;
end
plot(t,z1);grid on;hold on
plot(t,z2);
解决方案
你应该可以使用feval
,查看它的文档。
如果将定义更改zperim2
为:
z2perim = @(z1,z2,t) -((c/a)*z1)-((b/a)*z2)+((1/a)*feval(f, t));
然后您可以使用任意函数作为 f 的输入,例如,
@(t)sin(2*t)
完整的代码如下所示:
clc; clear; close all;
disp('A Differential Equation look like:');
disp('ay"+by''+cy=f(t)');
disp('if your variables are time variant, please enter after @(t) as function handle!')
disp('Enter your Coefficients');
a=input('a= ');
b=input('b= ');
c=input('c= ');
disp('Example of valid f: "@(t)sin(2*t)"');
f=input('f=');
disp('Enter your T limiation (enter in this way: [start,end])= ')
t_input=input('');
disp('Enter y(0) condition= ');
y0_input=input('');
disp('Enter y''(0) condition= ');
ydot0_input=input('');
disp('Enter your desirable error= ');
error=input('');
h=nthroot(error,4);
t=t_input(1):h:t_input(2);
n=length(t);
z1perim = @(z1,z2,t) z2;
z2perim = @(z1,z2,t) -((c/a)*z1)-((b/a)*z2)+((1/a)*feval(f, t));
z1=zeros(n,1);
z2=zeros(n,1);
z1(1)=y0_input;z2(1)=ydot0_input;
for ii = 1:n-1
k1=z1perim(z1(ii),z2(ii),t(ii));
l1=z2perim(z1(ii),z2(ii),t(ii));
k2=z1perim(z1(ii)+(h*k1/2),z2(ii)+(h*l1/2),t(ii)+h/2);
l2=z2perim(z1(ii)+(h*k1/2),z2(ii)+(h*l1/2),t(ii)+h/2);
k3=z1perim(z1(ii)+(h*k2/2),z2(ii)+(h*l2/2),t(ii)+h/2);
l3=z2perim(z1(ii)+(h*k2/2),z2(ii)+(h*l2/2),t(ii)+h/2);
k4=z1perim(z1(ii)+(h*k3),z2(ii)+(h*l3),t(ii)+h);
l4=z2perim(z1(ii)+(h*k3),z2(ii)+(h*l3),t(ii)+h);
z1(ii+1)=z1(ii)+(k1+2*k2+2*k3+k4)*h/6;
z2(ii+1)=z2(ii)+(l1+2*l2+2*l3+l4)*h/6;
end
plot(t,z1);grid on;hold on
plot(t,z2);
推荐阅读
- python - 如何在python中的pandas中添加缺少值的列
- html - 如何在 div 或 span 中制作无单词空间的单词,以便所有单词都以 div 宽度显示
- spring-boot - 部署新版本应用程序时向 yaml 文件添加新属性的最佳方法
- c# - 无法将公共列表作为方法的返回类型返回
- c++ - 对 boost::system::generic_category() 的未定义引用,尽管库被提供给 g++
- php - 分页不适用于 WordPress 的单个页面
- hive - 计算 Hive 中的不同问题
- c - 从 C 作为结构访问 Fortran 公共块
- sql - 如何让 Oracle SQL 查询按列名排序
- reactjs - 即使编译成功,Webpack 也不会在 localhost 中加载输出文件