matlab中solve的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中solve的用法相关的知识,希望对你有一定的参考价值。
我的函数如下
function s=sss(p)
syms x y;
equation1=sym('c*x^2+c*x*y+(c*g-c*a-c*b+1)*x-a-e=0');
equation2=sym('d*y^2+d*x*y+(d*g-d*a-d*b+1)*y-b-f=0');
[x0,y0]=solve(equation1,equation2,'x','y');
a=p(1);
b=p(2);
c=p(3);
d=p(4);
e=p(5);
f=p(6);
g=p(7);
x0=eval(x0);
y0=eval(y0);
s=[x0 y0];
取一个特殊的p=[0 0 0.1 0.2 0 0 3]
这时应该有一个[0 0]的解,可是matlab算出来的里面没有
只有
q =
-0.0000 -8.0000
-8.0000 0 - 0.0000i
-8.0000 0 + 0.0000i
求大侠帮忙
0 -8.0000
-8.5000 - 0.8660i -0.0000 + 0.0000i
-8.5000 + 0.8660i -0.0000 - 0.0000i
上面的结果自身就是不正确的,我分析的原因是:matlab先求出了解析解,接着代入系数值,由于matlab运算精度低,系数又太多,公式极其复杂,从而导致结果失真过于严重
mathematica运行结果显示:mathematica先求出解析解,接着精确代入系数值计算,也出现了数量级为-16的误差,有部分失真,但是这个失真很容易发现,而得到修正
mathematica执行消去y的运算结果显示原方程组只能由三组解
借助mathematica的结果分析,可以得出:matlab的运行结果中,并没有丢失一组解,而是解的失真太为严重达到了0.1,
可以用下面的程序执行数值解:
function s=sss(p)
syms x y
a=p(1);
b=p(2);
c=p(3);
d=p(4);
e=p(5);
f=p(6);
g=p(7);
a1=simplify(c*x^2+c*x*y+(c*g-c*a-c*b+1)*x-a-e);
a2=simplify(d*y^2+d*x*y+(d*g-d*a-d*b+1)*y-b-f);
[x0,y0]=solve(a1,a2);
s=[x0 y0]
这个程序运行速度快且结果准确,
结果为
[ 0, 0]
[ 0, -8]
[ -13, 0]
注:可以看到新的程序输出结果是矩阵形式,而老程序的输出不是,问题很可能和eval的使用有关. 参考技术A matlab运行结:
0
-8.0000
-8.5000
-
0.8660i
-0.0000
+
0.0000i
-8.5000
+
0.8660i
-0.0000
-
0.0000i面结自身确我析原:matlab先求解析解接着代入系数值由于matlab运算精度低系数太公式极其复杂导致结失真于严重mathematica运行结显示:mathematica先求解析解接着精确代入系数值计算现数量级-16误差部失真失真容易发现修mathematica执行消y运算结显示原程组能由三组解借助mathematica结析:matlab运行结并没丢失组解解失真太严重达0.1用面程序执行数值解:function
s=sss(p)
syms
x
ya=p(1);
b=p(2);
c=p(3);
d=p(4);
e=p(5);
f=p(6);
g=p(7);a1=simplify(c*x^2+c*x*y+(c*g-c*a-c*b+1)*x-a-e);a2=simplify(d*y^2+d*x*y+(d*g-d*a-d*b+1)*y-b-f);
[x0y0]=solve(a1a2);s=[x0
y0]
程序运行速度快且结准确结[
0
0][
0
-8][
-13
0]注:看新程序输结矩阵形式程序输问题能eval使用关. 参考技术B clear;clc;
syms H S
c=4.4545
[H,S]=solve(H==(5-0.514+0.00659*S+2.014*log10(S+10))/1.5,H==c)
fprintf(1,'H=%f\nS=%f\n',H,S)
MATLAB中plot函数用法
MATLAB中输入
>> x=1:0.1:3
f=sin(x)*(1+x)*log(1+x);
plot(x,f)
运行出错??? Error using ==> mtimes
Inner matrix dimensions must agree.
如果改成
>> x=1:0.1:3
f=sin(x).*(1+x).*log(1+x);
plot(x,f)
运行正确,可以绘出图形来。想知道sin(x)、(1+x)后面为什么必须加一个“.”才能运行?这个“.”代表什么,具体怎么用,什么地方加,什么地方不加?我是初学者。
要加.才能实现矩阵对应的元素相乘 如果不加是两个矩阵相乘 参考技术A 有"."的话表示数组乘法,对应数字做运算.没有"."的话就是整个矩阵在做运算.矩阵的运算和数组的运算显然是不同的.在本例中sin(x)*(1+x)*log(1+x)表示三个一行两列的矩阵相乘,有点线性代数的知识就知道,这样相乘显然是不合法的
以上是关于matlab中solve的用法的主要内容,如果未能解决你的问题,请参考以下文章