
你的问题属于目标函数存在附加参数情况下怎样传递附加参数的问题,一般有以下几种方法:
1、使用匿名函数,这是最简单的做法:
>> a = 1;x0 = 1;
>> x = fsolve(@(x)x+a, x0)
Optimization terminated: first-order optimality is less than optionsTolFun
x =
-12、使用嵌套函数(Nested
Functions)。
3、使用全局变量(不推荐)。
4、如果优化函数支持附加参数的传递,直接传递,例如,对于你现在的函数,可以直接写成
x = fsolve(@f, x0,[],a);对应的匿名函数形式为
x = fsolve(@(x,a)x+a, x0,[],a)
具体可搜索帮助关于“Passing
Extra
Parameters”的主题。
syms a b c d t x y ex1 = at+b-y; ex2 = ct+d-x; t = solve(ex2,'t'); y = solve(subs(ex1),'y') y = (-ad+ax+bc)/c
可以借助于嵌套函数或匿名函数实现附加参数的传递,例如
function main
y0 = [14; 01; 01];
A = linspace(eps, 10, 20);
Y = A NaN;
for ii = length(A)
a = A(ii);
y = ode45(@eq2, [0 a], y0);
Y(ii) = y(end, 1);
end
plot(A, Y)
function dy=eq2(t,y)
dy = y0;
dy(1)=-(ay(2))/(4exp(at/4));
dy(2)=-(a/4)(exp(at/4))(y(1)+05)+(a/4)y(2)-y(3)((exp(at/4))^2);
dy(3)=4y(2);
end
end
但微分方程组似乎是刚性的,不过换用ode15s、ode23s等适合刚性系统的算法效果也不理想(可以调用ode函数时不返回参数,观察求解的过程)。
fun=@(x,y)ylog10(y)-x创建关于x,y的匿名函数
log10(x)由于Matlab中自然对数的符号是log(与我们数学上的不同),以10为底的对数符号是log10,同理有log2,但是没有log3等哦
vpa将得到的符号解转化为指定精度的小数,比如vpa('sqrt(2)',10)将sqrt(2)表示10位精度的小数
fzero是Matlab求解一元函数零点的内置函数
fsolve是Matlab中求解方程组解(可以求解复数)的内置函数,功能强于fzero
fval是返回fun(x)的值,也就是说fzero和fsolve返回方程的解x,那么此时的fun(x)就是fval
这个方法比较多 可以数值也可以解析求解
1解析求解
>> solve('ylog10(y)=3','y')
ans =
3log(10)/lambertw(3log(10))
>> vpa(ans)
ans =
45555357051951280236911974082484
2数值解法这个可以使用fsolve和fzero,前者的功能更加强大,但是对于这个问题fzero就可以了
>>x=3;
>>fun=@(y)ylog10(y)-x;
%使用fsolve
>> [x,fval]=fsolve(fun,rand)
Optimization terminated: first-order optimality is less than optionsTolFun
x =
45555
fval =
39620e-008
%使用fzero
>> [x,fval]=fzero(fun,5)
x =
45555
fval =
-88818e-016
[a,b]=solve('ax^3-by^2=0','exp(ax^2)-y-1=0','a,b')
我的运行结果:
a =log(y+1)/x^2
b =log(y+1)x/y^2
你用的是2009的版本吗?听说与360冲突的http://help360cn/5030804/22713366html
装最新的360试试,360的工作人员说是解决了问题,实在不行卸360
如果是70较早的版本的话应该没问题,关了再进去运行看看
上面是我用71运行得的结果
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)