52matlab技术网站,matlab教程,matlab安装教程,matlab下载

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3793|回复: 2
打印 上一主题 下一主题

符号表达式转换为匿名函数

[复制链接]

123

主题

207

帖子

2996

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2996
跳转到指定楼层
楼主
发表于 2015-3-13 14:30:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用符号 (symbolic) 运算得到一个符号表达式后,我们可能需要令其进一步参与数值运算。然而,很多数值运算函数,比如数值积分函数(quad,quadgk,integral),都只能接受函数句柄作为输入。于是,将符号表达式转化为函数句柄就成了必然。 如果不怕麻烦,完全可以通过手动输入对应的符号表达式来建立函数句柄。然而,很多情况下我们得出的符号表达式可能极其复杂,甚至可能占据很多行。此时,手动输入显然相当不便。于是,找到一种自动将符号表达式转化为函数句柄的方法就显得尤为重要。
下面列举出三种自动转换的办法(三种办法得到的函数都是匿名函数):
1. 最简便的办法:利 用 matlabFunction(这个函数只适用于2009a及更新的版本,我测试了2012a可用,2014a和2014b用不了,可能是破解的问题)
syms x
y=exp(x)*x^2+x+1
g = matlabFunction(y)  
如果你的matlab报错,这说明你的版本太老或者破解有问题,那么请使用下面两种办法。
2.eval + vectorize 函数:vectorize 的目的是将字符串(string)表达式里的 * / ^ 替换为 .* ./ .^ ,以支持向量运算。eval 执行该字符串后得到函数句柄
syms x
y=exp(x)*x^2+x+1
g = eval(['@(x)',vectorize(y)])
这个方法需要借助 eval 函数,在论坛里已经被广大坛友广泛使用过。
3. str2func + vectorize 函数:str2func 函数可以直接将字符串转化为函数句柄
syms x
y=exp(x)*x^2+x+1
g = str2func(['@(x)',vectorize(y)])
回复

使用道具 举报

123

主题

207

帖子

2996

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2996
沙发
 楼主| 发表于 2015-3-13 23:38:08 | 只看该作者
今天正好遇到一个拟合的问题,用到了匿名函数

clear all
close all
clc

format long

t = (1:25)';
y = [ 5.0291; 6.5099; 5.3666; 4.1272; 4.2948; ...
6.1261; 12.5140; 10.0502; 9.1614; 7.5677; ...
7.2920; 10.0357; 11.0708; 13.4045; 12.8415; ...
11.9666; 11.0765; 11.7774; 14.5701; 17.0440; ...
17.0398; 15.9069; 15.4850; 15.5112; 17.6572];
p = polyfit(t,y,1);%这里做一次多项式拟合

coff_a = [p(2);p(1)];
save 'coef_ex2a.dat' 'coff_a'  -ascii

mse_ex2a = mean((polyval(p,t) - y).^2);
save 'mse_ex2a.dat' 'mse_ex2a'  -ascii

opts=optimset('MaxIter',600,'MaxFunEvals',600,'TolFun',1e-12,'TolX',1e-12);
coef_ex2b = lsqcurvefit(@(p,tdata)p(1)+p(2)*tdata +p(3)*sin(tdata),zeros(3,1),t,y,[],[],opts);
%这里做非线性曲线拟合
save 'coef_ex2b.dat' 'coef_ex2b'  -ascii

b1 = coef_ex2b(1);
b2 = coef_ex2b(2);
b3 = coef_ex2b(3);
mse_ex2b = mean((feval(@(t) b1+b2*t+b3*sin(t),t) - y).^2);
save 'mse_ex2b.dat' 'mse_ex2b'  -ascii
回复 支持 反对

使用道具 举报

123

主题

207

帖子

2996

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2996
板凳
 楼主| 发表于 2015-3-25 17:56:46 | 只看该作者
今天遇到了对匿名函数的参数个数是变动的情况,比如@(p,x)p(1)+p(2)*x+p(3)*x^2 + ...p(N)*x^(N-1),假设N为可变参数.我的解决办法是先申明sym向量
for k =1:N
    p(k) = sym(['p(',num2str(k),')']);
end
然后计算出sym类型的函数表达式
syms x
f = 0;
for k = 1:N
   f = f + p(k)*x^(k - 1);
end
最后将f转变为匿名函数

f = eval(['@(p,x)',vectorize(f)]);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|52matlab技术网站 ( 粤ICP备14005920号-5 )

GMT+8, 2024-4-27 15:32 , Processed in 0.073696 second(s), 18 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表