24小时热门版块排行榜    

查看: 570  |  回复: 4
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

liaoliao8545

新虫 (小有名气)

[求助] matlab问题

具体是:我要解一个非线性方程,方程中包含了一些参数,这些参数的值需要通过主程序提供。
例如:我要求解方程:ax+b/x+c=0的解,其中参数a、b、c的值必须由主程序计算得出,我变了一个子程序,通过主程序调用来解方程(当然实际程序要复杂得多):

子程序:
function f=fz(x)
f=a.*x+b./x+c;

主程序在命令窗口输入:
a=1;b=2;c=3;
x=fzero('fz',-5)

运行后总是出现如下错误提示:
??? Error using ==> fzero
FZERO cannot continue because user supplied function_handle ==> fz
failed with the error below.
Undefined function or variable 'a'.

但如果我将参数a=1;b=2;c=3;移到子程序中,变为:
子程序:
function f=fz(x)
a=1;b=2;c=3;
f=a.*x+b./x+c;

主程序在命令窗口输入:
x=fzero('fz',-5)

运行结果正常:x =   -2.0000

我现在存在的问题是参数a、b、c的值是由其它程序计算而来,不可能在子程序中输入,请问怎样将参数a、b、c的值传递到子程序?或者采用其它的解非线性方程的办法?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

liaoliao8545

新虫 (小有名气)

引用回帖:
2楼: Originally posted by 月只蓝 at 2013-05-11 11:17:19
以下m文件,直接复制进一个m文件中,运行即会在主窗口等待你输入a,b,c的数值。结果见附图1。

function solvenole314
clear all;clc
global a b c
format long

a=input('请输入a=');
b=input('请输入b=' ...

有没有那种直接调用  不需要手动输入的方法
y1=input('输入:y1=');
y2=input('输入:y2=');
y3=input('输入:y3=');
q=input('输入:q=');
T0=input('输入:T0=');
P=input('输入:P=');
%下面求Kp
T=[298        500        1000        1500        1800        2000        2200        2400        2500        2600        2800        3000        3200        3500        4000        4500        5000];
Kp10=[-45.066 -25.025 -10.221 -5.316        -3.698 -2.884 -2.226 -1.679 -1.44 -1.219 -0.825 -0.485 -0.189 0.19 0.692 1.079 1.386];
Kp20=[-40.018 -22.886 -10.062 -5.725 -4.270 -3.540 -2.942 -2.442 -2.224 -2.021 -1.658 -1.343 -1.067 -0.712 -0.238 0.133 0.430];
Kp30=[-46.181 -26.208 -11.322 -6.314 -4.638 -3.799 -3.113 -2.541 -2.158 -2.057 -1.642 -1.282 -0.967 -0.563 -0.025 0.394 0.728];
Kp40=[-71.224 -40.316 -17.292 -9.512 -6.896 -5.580 -4.502 -3.600 -3.202 -2.834 -2.718 -1.606 -1.106 -0.462 0.402 1.074 1.612];
Kp50=[-81.208 -45.890 -19.614 -10.790 -7.836 -6.356 -5.142 -4.130 -3.684 -3.272 -2.536 -1.898 -1.340 -0.620 0.340 1.086 1.636];
Kp60=[-15.171 -8.783 -4.062 -2.487 -1.962 -1.699 -1.484 -1.305 -1.227 -1.154 -1.025 -0.913 -0.815 -0.690 -0.524 -0.397 0.296];
Kp1=interp1(T,Kp10,T0,'cubic');Kp1=10^Kp1;
Kp2=interp1(T,Kp20,T0,'cubic');Kp2=10^Kp2;
Kp3=interp1(T,Kp30,T0,'cubic') ;Kp3=10^Kp3;   
Kp4=interp1(T,Kp40,T0,'cubic');Kp4=10^Kp4;
Kp5=interp1(T,Kp50,T0,'cubic');Kp5=10^Kp5;
Kp6=interp1(T,Kp60,T0,'cubic');Kp6=10^Kp6;
C1=sqrt(P)/Kp1;    C2=sqrt(P)/Kp2;
C7=Kp3/sqrt(P);  C6=P/Kp4;  C3=P/Kp5;  C10=Kp6;
n=y1+y3; m=4*y1;  l=2*y3;  k=2*y2;
r0=(1/q)*(n+m/4-l/2);
r=l/2+r0;
r1=k/2+3.76*r0;
if q<1.0
    x11=1/(1+m/4+r1)
else
    x11=1/(n+m/4+r1)
end

上面程序求出参数x11  C1 C2 n m r 的值
接下来求x3  是以下方程的正根
fx=2*x/x11+(2*C1*n*sqrt(x)+n)/(1+C1*sqrt(x))+C2*m*sqrt(x)/(2*(1+C2*sqrt(x)))-2*r;
怎么直接调用上面程序求出的参数值 (不是你说的那种手动输入)
3楼2013-05-11 16:19:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 5 个回答

月只蓝

主管区长 (职业作家)

★ ★
csgt0: 金币+2, 谢谢 2013-05-14 15:41:37
以下m文件,直接复制进一个m文件中,运行即会在主窗口等待你输入a,b,c的数值。结果见附图1。

function solvenole314
clear all;clc
global a b c
format long

a=input('请输入a=');
b=input('请输入b=');
c=input('请输入c=');


x= fzero(@fun314,[-5])


%--------------------------------
function y=fun314(x)
global a b c
y=a*x+b/x+c;


解方程组的情况,可参考http://muchong.com/bbs/viewthread.php?tid=5815452&authorid=1122189

附图1.jpg

MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2013-05-11 11:17:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

那就不用a=input('请输入a='); b=input('请输入b=');c=input('请输入c=')了,把计算a,b,c的程序加进来即可。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
4楼2013-05-11 16:37:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

liaoliao8545

新虫 (小有名气)

引用回帖:
4楼: Originally posted by 月只蓝 at 2013-05-11 16:37:38
那就不用a=input('请输入a='); b=input('请输入b=');c=input('请输入c=')了,把计算a,b,c的程序加进来即可。

就是把变量定义成全局变量就可以了   终于解决了 非常感谢
5楼2013-05-11 17:37:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见