求教高手!matlab解方程问题
clc;clear;m=;
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中的值并将求解结果存在一个数组中???????
=solve(fun,x0);
disp('求解成功性判断参数'),flag
if flag>0
disp('方程组的解成功')
elseif flag<=0
disp('方程组的解不成功')
end
disp('三维非线性方程组的解:'),x(i)
disp('三维非线性方程组解的函数值:'),fval
%end 要用1stOpt就很方便了:
LoopConstant m=;
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 不行啊!报错了!
??? Undefined function or method 'LoopConstant' for input arguments of type 'char'.
Error in ==> Untitled3 at 5
LoopConstant m=; 刚刚查了一下,上楼是说的另外一种软件啊!
但是不行啊,我现在是基于matlab做的一个程序,上面一段只是我所做的程序当中很小的一部分!要是换的话,那我所有的程序都要换了!还望哪位高手提出一点实质性的建议! 楼主搜索下本版吧,这样的问题讨论过很多次了。匿名函数或者嵌套函数+fsolve就可以解决了。 根据版主的提示,已经解决了。特意总结了相关解决方法供大家参考
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=;
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=;
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=;
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; 只是还有一个问题,如何将我求救的结果输出到x(i)数组中? 不过我发现一个问题,求解的结果与二楼给我的结果对不上。我的结果是个错的,不知道是什么原因。
function jiaodian
clc;clear;
m=;%m表示泵轮扭矩系数/10e-6
n=12; %泵轮扭矩系数个数
ii=;%液力变矩器的速比
k=; %液力变矩器的变矩比
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=;
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 上面的问题也搞定了!实际上涉及到matlab内部的一个算法问题!matlab求解方程搜索解并不是从设定的起始位置向前搜索,而是前后都会搜索,哪个最近就会是哪个!修改一下我的程序,结果马上就对了!
function jiaodian
clc;clear
m=;%m表示泵轮扭矩系数/10e-6
n=12; %泵轮扭矩系数个数
ii=;%液力变矩器的速比
k=; %液力变矩器的变矩比
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=; %Tp为液力变矩器泵轮转矩
y=; %求两者之间的交点
end
%使用嵌套函数时,嵌套函数和主函数都必须用end表示函数结束
for i=1:1:n;
%x0=1600;
x(i)=fsolve(@tes,x0) %x表示共同作用点的转速
z(i)=Ttq; %z表示共同作用点的扭矩
x0=x(i);
end
end ;P;P;P;P自问自答 答的精彩
页:
[1]