如何使用产品标量值创建向量函数句柄(匿名函数),然后绘制结果.显然,我想绘制这个公式
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);
TL; DR:matlabFunction返回一个通常更快的匿名函数,但符号函数更灵活.但在这种情况下,无论哪种方式都无关紧要,因为函数非常简单,评估数据的数量很少;因此它几乎可以立即计算.但是使用matlabFunction可能是个好习惯.