matlab – 如何创建表达式或向量函数句柄,然后绘制它?

如何使用产品标量值创建向量函数句柄(匿名函数),然后绘制结果.显然,我想绘制这个公式

Let f(x,ym)= (1-exp(x-ym)/h); and 
iX(x)=1/6.f(x,ym(1))+
      7/6.f(x,ym(2))+
     25/6.f(x,ym(3))+
     43/6.f(x,ym(4));

iY(x)=1/5.f(x,ym(1))+
      2/5.f(x,ym(2))+
     14/5.f(x,ym(3))+
      4/5.f(x,ym(4));

这个代码没有循环但是给我:”使用绘图时出错转换从sym加倍是不可能的”.

clear all;clc;a=0;b=2;n=3;h=(b-a)/n;ym=a:h:b;                                      
X=[ 1/6, 7/6, 25/6,43/6];  % Data 
Y=[ 1/5, 2/5, 14/5,14/5];                                                   
f=@(x,ym) (1-exp(x-ym)/h);                                                              
% with syms 
syms x; 
iX=f(x,ym(1:length(ym))).*X; % result iX= [f.1/6 , f.7/6 , f.25/6 , f.43/6]
iY=f(x,ym(1:length(ym))).*Y;
iFx= sum(iX);iFy=sum(iY);   % result  iFx= f.1/6 + f.7/6 + f.25/6 + f.43/6
x=ym;
plot(x,iFx,'r+');hold on;plot(x,iFy,'og');

此外,我厌倦了使用具有循环条件的替代代码,但错误仍然存​​在,因为无法从sym转换为逻辑.

% clear all;clc
% a=0;b=2;n=3;h=(b-a)/n;ym=a:h:b; 
% %
% X=[ 1/6, 7/6, 25/6,43/6]; % Data
% Y=[ 1/5, 2/5, 14/5,4/5];
% %   
% f=@(x,ym) (1-exp(x-ym)/h);                
% %
% syms x  %double(subs(x))
% iX=cell(1,length(ym));iY=cell(1,length(ym)); %  cell, iX{k} and iY{k} 
% % iX=zeros(1,length(ym));iY=zeros(1,length(ym));
% for k=1:length(ym)           
% %          iX(k) =   f(x,ym(k)).*X(k);
% %          iY(k) =   f(x,ym(k)).*Y(k);  
%            iX{k} = @(x,k)  f(x,ym(k)).*X(k);
%            iY{k} = @(x,k)  f(x,ym(k)).*Y(k);
%            iX(x,k);
% end       
% whos 
% x=ym; 
% plot(x,iX{:},'r:');hold on;plot(x,iY{:},'b--'); 

拜托,我该怎么办呢?

最佳答案 你不能直接调用plot(x,iFx),因为iFx(和iFy)是依赖于x的符号变量,而不是实际将一些实际值放入其中的输出.最简单的方法是修复这个问题,以便a)使用
symfun(formula,variables)和b)将符号变量转换为符号函数,然后使用要绘制它们的值调用所述函数:

clear all;clc;a=0;b=2;n=3;h=(b-a)/n;ym=a:h:b;                                      
X=[ 1/6, 7/6, 25/6,43/6];  % Data 
Y=[ 1/5, 2/5, 14/5,14/5];                                                   
f=@(x,ym) (1-exp(x-ym)/h);                                                              
% with syms 
syms x; 
iX=f(x,ym(1:length(ym))).*X; % result iX= [f.1/6 , f.7/6 , f.25/6 , f.43/6]
iY=f(x,ym(1:length(ym))).*Y;
iFx= sum(iX);iFy=sum(iY);   % result  iFx= f.1/6 + f.7/6 + f.25/6 + f.43/6


% same code until here

% step a) turn to symbolic function
iFx = symfun(iFx,x); iFy = symfun(iFy,x);

% step b) call the function with the "x" value of the plot.
plot(ym,iFx(ym),'r+');
hold on;
plot(ym,iFy(ym),'og');

编辑:

当然,你可以用matlabFunction做同样的事情:

iFx = matlabFunction(iFx); iFy = matlabFunction(iFy);

有关symfun vs matlabFunction的讨论,请参阅:matlab symfun vs anonymous function

TL; DR:matlabFunction返回一个通常更快的匿名函数,但符号函数更灵活.但在这种情况下,无论哪种方式都无关紧要,因为函数非常简单,评估数据的数量很少;因此它几乎可以立即计算.但是使用matlabFunction可能是个好习惯.

点赞