找回密码
 注册
Simdroid-非首页
查看: 174|回复: 9

求教高手!matlab解方程问题

[复制链接]
发表于 2011-8-22 13:46:52 | 显示全部楼层 |阅读模式 来自 湖南长沙
clc;clear;
m=[5.185 5.33 5.46 5.588 5.631 5.545 5.542 5.115 4.6 3.138 2.365 0];
for i=1:1:12
x0=1500;
    fun=inline('1.6501*10^(-8)*x^4 - 2.107*10^(-12)*x^5 - 0.000050348*x^3 + 0.074159*x^2 - 52.327*x + 14984.0-m(i)*5*10^(-6)*860*10*0.36^5*x^2','x');
%该方程随m值的变化而变,所以得出的应是一组解,应该怎样来循环调用m中的值并将求解结果存在一个数组中???????
    [x(i),fval,flag]=solve(fun,x0);
disp('求解成功性判断参数'),flag
if flag>0
    disp('方程组的解成功')
elseif flag<=0
    disp('方程组的解不成功')
end
disp('三维非线性方程组的解:'),x(i)
disp('三维非线性方程组解的函数值:'),fval
%end
发表于 2011-8-22 20:43:29 | 显示全部楼层 来自 北京海淀
Simdroid开发平台
要用1stOpt就很方便了:

  1. LoopConstant m=[5.185,5.33,5.46,5.588,5.631,5.545,5.542,5.115,4.6,3.138,2.365,0];
  2. Function 1.6501*10^(-8)*x^4-2.107*10^(-12)*x^5-0.000050348*x^3+0.074159*x^2-52.327*x+14984.0-m*5*10^(-6)*860*10*0.36^5*x^2;
复制代码
结果:
m        x
5.185        803.85569723998
5.33        795.946693856704
5.46        789.258004324909
5.588        783.006813195293
5.631        780.975876513545
5.545        785.071761251808
5.542        785.217124371156
5.115        807.85954869581
4.6        841.939813470063
3.138        1037.96756152503
2.365        1255.85049605937
0        2458.07247179844

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-22 21:02:03 | 显示全部楼层 来自 湖南长沙
不行啊!报错了!
??? Undefined function or method 'LoopConstant' for input arguments of type 'char'.

Error in ==> Untitled3 at 5
LoopConstant m=[5.185,5.33,5.46,5.588,5.631,5.545,5.542,5.115,4.6,3.138,2.365,0];
回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-22 21:12:22 | 显示全部楼层 来自 湖南长沙
刚刚查了一下,上楼是说的另外一种软件啊!
但是不行啊,我现在是基于matlab做的一个程序,上面一段只是我所做的程序当中很小的一部分!要是换的话,那我所有的程序都要换了!还望哪位高手提出一点实质性的建议!
回复 不支持

使用道具 举报

发表于 2011-8-24 09:34:07 | 显示全部楼层 来自 北京
楼主搜索下本版吧,这样的问题讨论过很多次了。匿名函数或者嵌套函数+fsolve就可以解决了。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-26 10:05:11 | 显示全部楼层 来自 湖南长沙
根据版主的提示,已经解决了。特意总结了相关解决方法供大家参考
fsolve、fzero、fmincon、fminbnd、nlinfit、lsqcurvefit等含参数问题
含参数非线性方程组求解方法总结
最近论坛每天都有人询问含参数非线性方程组求解问题,为了方便大家查询,在此对相关方法做一小结。
以fsolve求解方程组a*log(x1)+x2^2-5=0;exp(x1)+b*sin(x2)-10=0为例。

方法一:全局变量法
function glo
global a b
%主函数定义全局变量
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0)

function y=tes(x)
global a b
%子函数定义全局变量
y=[a*log(x(1))+x(2)^2-5;
    exp(x(1))+b*sin(x(2))-10];
%以上存为glo.m
%在命令窗口输入
glo
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.

x =

   1.80833796874946   1.79520903756128
方法二:嵌套函数法
注:此方法在MATLAB7.0以上版本可用
function nesti

function y=tes(x)
%使用嵌套函数时,嵌套函数可以直接调用主函数变量
y=[a*log(x(1))+x(2)^2-5;
    exp(x(1))+b*sin(x(2))-10];
end
%使用嵌套函数时,嵌套函数和主函数都必须用end表示函数结束
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0)
end
%以上存为nesti.m
%在命令窗口输入
nesti
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.

x =

   1.80833796874946   1.79520903756128
方法三:没有名字(推荐使用方法)
function unname
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0,[],a,b)
%[]表示fsolve的输入参数options采用默认值

function y=tes(x,a,b)
y=[a*log(x(1))+x(2)^2-5;
    exp(x(1))+b*sin(x(2))-10];
%以上存为unname.m
%在命令窗口输入
unname
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.

x =

   1.80833796874946   1.79520903756128
4. 匿名函数法(Anonymous function)
适用于MATLAB7以及以后的版本

function withaddtionparas4
options = optimset('Display', 'off'); % Turn off Display
b =2; c = 3.5; x0 =0;
y = fsolve(@(x)mypoly(x,b,c), x0, options)

function y = mypoly(x,b,c)
y = x^3 + b*x + c;
这个方法不错
再总结一种方法,也适用于在GUI中参数传递,利用setappdata/getappdata函数。
function withaddtionpara7
data.b = 2;
data.c = 3.5;
x0 =0;
setappdata(0,'data',data);
options = optimset('Display', 'off'); % Turn off Display
y = fsolve(@poly, x0, options)

function y = poly(x) % Compute the polynomial.
data = getappdata(0,'data');
b = data.b;
c = data.c;
y = x^3 + b*x + c;

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-26 10:05:55 | 显示全部楼层 来自 湖南长沙
只是还有一个问题,如何将我求救的结果输出到x(i)数组中?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-26 13:58:20 | 显示全部楼层 来自 湖南长沙
不过我发现一个问题,求解的结果与二楼给我的结果对不上。我的结果是个错的,不知道是什么原因。
function jiaodian
clc;clear;

  m=[5.185 5.33 5.46 5.588 5.631 5.545 5.542 5.115 4.6 3.138 2.365 0];  %m表示泵轮扭矩系数/10e-6
  n=12;    %泵轮扭矩系数个数
  ii=[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1];  %液力变矩器的速比
  k=[2.55 2.346 2.15 1.995 1.765 1.58 1.385 1.193 1.01 0.842 0.76 0]; %液力变矩器的变矩比
  ds=860;            %油液密度
  D=0.36;            %变矩器有效直径
  n1=850:1:2460;     %转速
  
  
function y=tes(x)
  %使用嵌套函数时,嵌套函数可以直接调用主函数变量
  Ttq=1.6501*10^(-8)*x^4 - 2.107*10^(-12)*x^5 - 0.000050348*x^3 + 0.074159*x^2 - 52.327*x + 14984.0;  %Ttq为发动机外特性曲线      
  Tp=m(i).*10^(-6)*ds.*10*D.^5*x^2;      %Tp为液力变矩器泵轮转矩
  y=[Ttq-Tp];
end
%使用嵌套函数时,嵌套函数和主函数都必须用end表示函数结束

for i=1:1:n;

    x0=500;
    x(i)=fsolve(@tes,x0)                 %x表示共同作用点的转速
    z(i)=Ttq                            %z表示共同作用点的扭矩
end
   
end

结果:
x =

  1.0e+003 *

  Columns 1 through 10

    1.7818    1.7645    1.7495    1.7352    1.7305    1.7400    1.7403    1.7903    1.8586    0.9628

  Columns 11 through 12

    0.9413    0.8970
回复 不支持

使用道具 举报

 楼主| 发表于 2011-8-29 12:52:28 | 显示全部楼层 来自 湖南长沙
上面的问题也搞定了!实际上涉及到matlab内部的一个算法问题!matlab求解方程搜索解并不是从设定的起始位置向前搜索,而是前后都会搜索,哪个最近就会是哪个!修改一下我的程序,结果马上就对了!
function jiaodian
clc;clear
  
  m=[5.185 5.33 5.46 5.588 5.631 5.545 5.542 5.115 4.6 3.138 2.365 0];  %m表示泵轮扭矩系数/10e-6
  n=12;    %泵轮扭矩系数个数
  ii=[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1];  %液力变矩器的速比
  k=[2.55 2.346 2.15 1.995 1.765 1.58 1.385 1.193 1.01 0.842 0.76 0]; %液力变矩器的变矩比
  ds=860;            %油液密度
  D=0.36;            %变矩器有效直径
  x0=1600;

  
function y=tes(x)
  %使用嵌套函数时,嵌套函数可以直接调用主函数变量
  Ttq=4.624*10^(-6)*x^3 - 7.808*10^(-10)*x^4 - 0.0104*x^2 + 10.45*x - 2976.0;  %Ttq为发动机外特性曲线      
  Tp=[m(i).*10^(-6)*ds.*10*D.^5*x.^2];      %Tp为液力变矩器泵轮转矩
  y=[Ttq-Tp];   %求两者之间的交点
end
%使用嵌套函数时,嵌套函数和主函数都必须用end表示函数结束

for i=1:1:n;
    %x0=1600;
    x(i)=fsolve(@tes,x0)                 %x表示共同作用点的转速
    z(i)=Ttq;                            %z表示共同作用点的扭矩
    x0=x(i);
end   

end
回复 不支持

使用道具 举报

发表于 2011-11-16 20:15:20 | 显示全部楼层 来自 安徽合肥
;P;P;P;P自问自答 答的精彩
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-6-21 04:05 , Processed in 0.044866 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表