Matlab输入函数出错

主程序
tdata=1980:2009;
ndata=[598.75 620.12 634.65 663.53 728.12 862.73 952.21 1073.84 1304.66 1524.67 1642.75 1947.18 2429.96 3327.04 4255.19 5349.53 5126.22 5649.93 5763.67 6213.24 7022.98 7806.18 8730.00 11708.49 14595.29 16876.78 19631.23 23108.63 25968.38 24888.08 ];
logmal.m函数
function [ Nt ] = logmal( a,tdata )
Nt=a(1).*(1.05^(tdata-1980))/(1+(a(1)/a(3)-1)*exp(-a(2)*(tdata-1980)));
end
错误提示:
Subscript indices must either be real positive integers or logicals.

Error in logmal (line 2)
Nt(i)=a(1).*(1.05^(tdata(i)-1980))/(1+(a(1)/a(3)-1)*exp(-a(2)*(tdata(i)-1980)));

Error in lsqcurvefit (line 195)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in A3 (line 6)
a0=lsqcurvefit(@logmal,a,tdata,ndata);%最小二乘法

Caused by:
Failure in initial user-supplied objective function evaluation. LSQCURVEFIT
cannot continue.

第1个回答  2014-09-13
就楼主所举的这个例子而言,其自身就支持向量运算,直接调jia(a,b)就可以了。

但我猜测,楼主的函数并不是这么简单,可能是函数本身不支持向量运算(例如,表达式里面有乘、除或乘方之类的运算),而且又由于某种原因不想对函数进行修改,这种情况下,如果想实现对多组输入数据的支持,可考虑使用arrayfun函数,例如:
a=1:2:5;b=2:2:6;arrayfun(@jia,a,b)
请采纳。
第2个回答  2014-09-13

你好

由于看不到你的具体程序,不知道你的a是什么。应该是你的logmal.m函数有问题。Nt的表达式中,应该是向量计算,应该修改采用.*和./。修改如下:

Nt=a(1)*(1.05^(tdata-1980))/(1+(a(1)/a(3)-1).*exp(-a(2)*(tdata-1980)));

如果还有错误,请把具体程序告诉我。

希望对你有帮助

追问

百度限制字数,只能用图了。。抱歉

ndata的值见原题里,或者随便取30个值.

子函数logmal.m也就是上面的。

追答clear,clc
tdata=1980:2009;
ndata=[598.75 620.12 634.65 663.53 728.12 862.73 952.21 1073.84 1304.66 1524.67 1642.75 1947.18 2429.96 3327.04 4255.19 5349.53 5126.22 5649.93 5763.67 6213.24 7022.98 7806.18 8730.00 11708.49 14595.29 16876.78 19631.23 23108.63 25968.38 24888.08 ];
a00=[100000 0.16 598.75];
Nt=inline(vectorize('a(1)*(1.05^(tdata-1980))/(1+(a(1)/a(3)-1).*exp(-a(2)*(tdata-1980)))'),'a','tdata');
a0=lsqcurvefit(Nt,a00,tdata,ndata);
tfit=1980:2015;
nfit=a0(1)./(1+(a0(1)/a0(3)-1).*exp(-a0(2)*(tfit-1980)));
plot(tdata,ndata,'r',tfit,nfit,'b')

应该还是目标函数,vectorize函数把全部的*/换成.*和./,就没有报错了。

本回答被提问者和网友采纳

matlab中findpeaks函数报错--输入参数太多
在matlab环境下,遇到findpeaks函数报错,提示输入参数过多。错误产生的原因是没有正确使用MathWorks提供的findpeaks函数。在命令行中尝试输入:结果出现错误。findpeaks函数实际上包含在信号处理工具箱内。同时,该函数还可能存在于其他路径中。如果在调用findpeaks函数时,没有正确指定MathWorks的路径,就会导致调用...

matlab,初学者,它为什么老说我“输入参数的数目不足。”
MATLAB出现“输入参数的数目不足”的错误提示是因为你在调用函数或执行某个操作时,提供的参数数量不符合函数或操作的要求。详细解释:1. 函数调用与参数要求不匹配:当你在MATLAB中使用函数时,每个函数都有其特定的参数要求。如果你调用的函数需要两个参数,但只提供了一个,或者提供了过多的...

我使用MATLAB的function函数怎么老提示错误
函数不是这么调用的,调用格式有错误。可以先输入xn,dn,M,mu的值,然后再调用,格式:[yn,W,e2]=LMS(xn,dn,M,mu)

求教,matlab里边使用function一直出错
你的代码没有问题。问题可能出在窗口命令上。>> num(1,2) 这里的括号和逗号为全角,应以半角形式输入字母,数值,符号等。

我用MATLAB的function函数,怎么老是提示错误
可能是因为mean已经在matlab中存在了,你help mean 就可以发现mean是求平均数的,你换个函数名试试吧

matlab中input函数报错
错误在于input后的大括号!修改代码:erasers=4;pads=6;tape=input('enter the number of rolls of tape perchased>');items=erasers+pads+tapecost=erasers*25+pads*52+tape*99average_cost=cost\/items运行结果:

matlab提示错误:此上下文中不允许函数定义.
1、首选,打开编译器,然后在命令行中键入edit打开,如下图所示。2、其次,完成上述步骤后,输入Function以表明该文件是功能文件,如下图所示。3、接着,如果在等号的左侧输入了任何返回值,请使用方括号表示多个返回值,如下图所示。4、然后,等号的右边是函数名称加括号,括号是参数,如下图所示。5、...

用MATLAB照书上代码打后提示:"错误: 此上下文中不允许函数定义."
1、打开编译器,在命令行输入edit打开。2、输入Function代表此文件是函数文件。3、如果有返回值在等号的左边输入,多个返回值用中括号。4、等号右面是函数名加括号,括号内是参数。5、使用%注释,注释的第一行是说明函数的功能。6、传入两个点的坐标,之后计算两点的距离,传给返回值y。7、保存文件,保存的...

Matlab用solve函数,提示错误
solve函数出错时,可以检查代码是否有如下问题:1、是否有调用格式的错误,传入的表达式参数需要统一为字符串,或者统一为符号变量。(matlab在帮助程序中已经删去了对字符串传参的说明,字符串传参很有可能在未来版本被删除,因此推荐使用符号表达式传参数)2、表达式中有错误。①等式中的等号,对于字符串来...

matlab使用ode45函数一直报错,哪位大佬能帮帮忙?
【出错原因及编程错误】1、主程序 1)时间区间设定错误,t=12000值设定偏大,不符合微分方程题意,所以t应取1.2。所以 tspan=[0 1.2]; 而不是tspan=[0 12000];2) for i=[1: (size(y,5))];...end 该循环语句没有作用 2、自定义微分方程函数 1)dTUdt=TMfunc(t,y)定义有误,与...

相似回答
大家正在搜