Re: [问题] 解完联立无法直接得到值

楼主: ejialan (eji)   2018-07-10 10:14:09
※ 引述《ccam (′・ω・`)》之铭言:
: 遇到的问题是
: 透过两条由连接两个点的线来找交点
: 都是简单的二元一次线性方程式
: 但是方程式的斜率和常数会需要一直改变
: 所以先用下面的方法测试
: 但是得出的交点却显示代数而不是直接显示数值
: 想要看数值必须把那串代数答案重新输入才看的到
: 有没有办法在跑的过程中直接得到数值答案?
: 变成:
: x=4
: y=4
: 这样。
: 感谢。
: 程式码:
: %Line_1
: x1=0;
: y1=0;
: x2=8;
: y2=8;
: a = polyfit([x1,x2],[y1,y2],1);
: %Line_2
: x3=0;
: y3=8;
: x4=8;
: y4=0;
: b = polyfit([x3,x4],[y3,y4],1);
: value_ax = a(1,1); %Line1斜率
: value_ay = a(1,2); %Line1常数
: value_bx = b(1,1); %Line2斜率
: value_by = b(1,2); %Line2常数
: syms x y
: [x,y] = solve('y = value_ax * x + value_ay','y = value_bx * x + value_by')
: 结果:
: x =
: -(value_ay - value_by)/(value_ax - value_bx)
: y =
: (value_ax*value_by - value_ay*value_bx)/(value_ax - value_bx)
法1:
问题在于你的写法不会帮你把值代入字串
你可以把你solve里的字串贴到Command Window执行
会发现你value_ax等变量还是保留成字串
要代入的话要使用num2str把数值转成字串如下
[x,y] = solve(['y=' num2str(a(1,1)),'*x+',num2str(a(1,2))],['y=',...
num2str(b(1,1)),'*x +', num2str(b(1,2))])
法2:
solve也可以吃符号变量
所以可以把要解的方程式令成eq1=0,eq2=0的形式
syms x y
eq1=a(1,1)*x+a(1,2)-y;
eq2=b(1,1)*x+b(1,2)-y;
[x,y]=solve(eq1,eq2)
法3:
既然是线性方程可以整理成矩阵Ax=b的形式
然后x=A\b
A=[a(1,1) -1
b(1,1) -1];
bb=-[a(1,2);b(1,2)];
xy=A\bb
法4:
其实你解出来的结果就是没代值的代数解
用subs或eval就可以把值代入了
所以最后加个
x=subs(x)
y=subs(y)

x=eval(x)
y=eval(y)
注意每个方法解完的变量型态略有不同
solve、subs出来会是符号变量
左除(\)、eval会是浮点数
作者: ccam (C.C.C)   2018-07-10 13:40:00
大感谢!!!

Links booklink

Contact Us: admin [ a t ] ucptt.com