作业帮 > 综合 > 作业

matlab解方程的错误

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 05:43:57
matlab解方程的错误
>> solve('(16-p)*poisscdf(p,100)+p-16=0','p')
Error using ==> mupadengine.mupadengine>mupadengine.feval at 162
Error:cannot differentiate equation [numeric::fsolve]
Error in ==> solve>mupadSolve at 232
list = feval(symengine,'mlfsolve',eqns,vars);
Error in ==> solve at 93
[R,symvars,order] = mupadSolve(eqns,vars);
出错的原因是,poisscdf 是以数值方法计算泊松累积分布函数的,不能用符号方法求解.
要解这个方程,可以用fsolve,例如:
>> fsolve(@(p)(16-p)*poisscdf(p,100)+p-16,0)
Optimization terminated: first-order optimality is less than options.TolFun.
ans =
    16
再问: 不好意思。。我写错了 应该是(19+4*Q/k)*poisscdf(k,100)-4*Q/k-8=0,求k=?(含Q) 应该如何做啊
再答: 数值方法无法求出含有符号的解来,只能对于给定的Q,计算出对应的k来。在一定范围内多取几个Q值,计算出相对应的一组k来,可以画出曲线,然后可以酌情进行拟合,得到满足此方程的k与Q的关系。 例如,就你所说的函数而言,可用下面的代码绘图:QQ = [];
kk = [];
for Q=-10:1:10,
    f = @(k)(19+4*Q./k).*poisscdf(k,100)-4*Q./k-8;
    [k,fval,exitflag] = fsolve(f,-sign(Q));
    h = ezplot(f);
    c = rand(1,3);
    set(h,'color',c);
    hold on,
    plot(k,0,'o','color',c)
    if exitflag == 1
        QQ = [QQ; Q];
        kk = [kk; k];
    end
end
figure
plot(QQ,kk,'.-')
xlabel('Q');
ylabel('k'); 第一个图为取不同的Q值,分别把函数相对k变化的曲线用不同的颜色画出来,并且求出满足方程的k值标在图中。需要说明几点:1、对于Q=0,方程无解。2、对于Q=-1,方程有解,但由于初值选择不当,未能求出来。需要或者改变初值,或者增加MaxFunEvals的值。3、经尝试,初值选择为 -0.1*sign(Q) 效果更为理想(注意:由于对于每个Q,曲线都基本呈现为类似双曲线的形状,初值的符号尤为重要)。 第二张图表示了k和Q之间的关系,由图可见,二者基本满足线性关系 k=-0.5*Q。当然,这并非方程的准确解,但在Q=-10~10之间可以很高的精度成立。对于Q取其他范围的值,可以用类似的方法来做(可能需要注意适当调整初值以及fsolve的算法设置)。