求助matlab大神,怎样把一个变量带入3元方程中,做出3维图形~~~~~~~~~~~~~~~~

作者&投稿:雷从 (若有异议请与网页底部的电邮联系)
各位matlab高手,如何从2个3元方程中消去一个变量,然后做3维图形~~~~~~~~~~~

近段时间不知道怎么原因,校园网不能访问百度空间,所以你的问题我没法看。
后来用手机打开看的,虽然费了一些波折,但总还是看到了。

对这个问题,其实用我之前在下面这个提问中说到的方法解决并不困难:
http://zhidao.baidu.com/question/561545056?&oldq=1
当时我说到“无解时会报错(可通过try...catch结构处理)”,但没进一步做,现在正好通过这个例子给你演示一下。

顺便问一下,现在的f(x,y,z)=0方程与之前在这个提问中的不一样?
http://zhidao.baidu.com/question/561281304?&oldq=1
我开始的时候用上面说的方法去做,求出来的结果画出图来看上去和以前的差别很大,还以为是方法有问题呢,后来仔细看,原来方程变了。

仍然用这个帖子里的方法:
http://zhidao.baidu.com/question/561151606?&oldq=1
取不同的z值画x-y曲线,现在的方程f(x,y,z)=0得到的一组x-y曲线如下:

从图中可见,x和y之间有很好的线性程度(甚至斜率都差别不大)。这个特点也可以作为你进一步研究的参考。

下面是程序和绘图结果(全部代码保存一个文件中运行)。
function zdN= 10;x = linspace(eps, 0.000001-eps, N);z = linspace(1,50000, N);[x, z] = meshgrid(x, z);y = arrayfun(@f_xz, x, z);% 方程1:R=f(x,y,z)R=(-2.*pi.*0.05415./(2.*x)).*(1./2.*(((1820-1000).*z.*9.8./... 0.05415)).*(y.^2.*(x-y./3)-4./3.*((2000-1000)./(1820-... 1000)).*x.^3-(((2.*x-y).*y).^0.5).^2.*((-2.* ((((2.*x-... y).*y).^0.5)./x).*(((((2.*x-y).*y).^0.5)./x.*cos(5.*pi... /6)+((x.^2-(((2.*x-y).*y).^0.5).^2).^0.5./x).*sin(5.*pi... /6))).*0.05415./(1820.*x.^2.*z.*9.8)-(4./3).*2000./1820+... (2./3-((x.^2-(((2.*x-y).*y).^0.5).^2).^0.5./x)+(1./3).*... (((x.^2-(((2.*x-y).*y).^0.5).^2).^0.5./x)).^3)+1000./... 1820.*(2./3+((x.^2-(((2.*x-y).*y).^0.5).^2).^0.5./x)-... (1./3).*(((x.^2-(((2.*x-y).*y).^0.5).^2).^0.5./x)).^3))... .*x./((1000/1820-1).* ((((2*x-y).*y).^0.5)./x).^2)))).^2;clfmesh(x, z, R);view(-150,35)xlabel('x')ylabel('z')zlabel('R')% 由方程2:f(x,y,z)=0,计算y=g(x,z)function y0 = f_xz(x0, z0)syms x y zf=1/2*((1820-1000)*z*9.8/0.05415)*(y^2*(x-y/3)-4/3*((2000-... 1000)/(1820-1000))*x^3-(((2*x-y)*y)^0.5)^2*((-2*((((2*... x-y)*y)^0.5)/x)*((((2*x-y)*y)^0.5)/x*cos(5*pi/6)+((x^2-... (((2*x-y)*y)^0.5)^2)^0.5/x)*sin(5*pi/6))*0.05415/(1820*... x^2*z*9.8)-(4/3)*2000/1820+(2/3-((x^2-(((2*x-y)*y)^0.5)... ^2)^0.5/x)+(1/3)*(((x^2-(((2*x-y)*y)^0.5)^2)^0.5/x))^3)... +1000/1820*(2/3+((x^2-(((2*x-y)*y)^0.5)^2)^0.5/x)-(1/3)... *(((x^2-(((2*x-y)*y)^0.5)^2)^0.5/x))^3))*x/((1000/1820-... 1)* (((((2*x-y)*y)^0.5)/x))^2)))-(((2*x-y)*y)^0.5*... sin(acos(y/x-1)-(5*pi/6))); % 对给定x、z,求解y% 使用try...catch结构避免方程无解时出错,如果无解,则返回NaNtry y_xz = @(x0,z0) fzero( @(y0) double(subs(f,{x,y,z}, ... {x0,y0,z0})), [0 x0], optimset('TolFun', eps)); y0 = y_xz(x0, z0);catch disp(lasterr); y0 = NaN;end

楼上的程序写的还不错,但是,建议在提交答案之前至少应该做一些基本的验证工作。毕竟,提供一个错误的答案比起没有答案不见得会好到哪里去。

我对这个问题的直观反应是,两个曲面的交线应该会比较平滑,而不应该像楼上给出来的这样杂乱无章。不妨通过一小段绘图的代码验证一下:
N = 25;x=linspace(0.52, 0.53, N); y=linspace(-1e-9, 0, N); z=linspace(1, 20000, N);[x,y,z]=meshgrid(x,y,z);F1=-2.*pi.*0.05415.*0.0000002.*sin(x).*sin((5.*pi./6)+x)-4./3.*pi.* ... 0.0000002.^3.*2000.*z.*9.78+2./3.*pi.*z.*9.78.*0.0000002.^3.* ... (1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.78.*0.0000002.^3.* ... (1820+1000)-pi.*z.*9.78.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ... (1820-1000).*(sin(x)).^2; F2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.78.*(1820-1000)./0.05415).^ ... 0.5.*0.0000002.*sin(x))+(z.*9.78.*(1820-1000)./0.05415).^0.5.* ... y.*besselk(1,(z.*9.78.*(1820-1000)./0.05415).^0.5.*0.0000002.*sin(x));clf; p = patch(isosurface(x,y,z,F1,0,z));set(p,'facecolor','w','EdgeColor','flat');p = patch(isosurface(x,y,z,F2,0,z));set(p,'facecolor','interp','EdgeColor','interp');view(-10,35);grid on;xlabel('x')ylabel('y')zlabel('z')绘制得到的曲面图形如下。



从图中我们很直观地初步得到几点结论:

(1)方程1的曲面对y几乎不相关。这一点其实比较容易理解,因为方程中y只出现在下面这一项中
(y+0.0000002.*cos(x))我们把这个式子的两项绝对值做一下对比:
max(abs(y(:)./(0.0000002.*cos(x(:)))))可以得到,最大值仅为0.0058,所以y在这个方程中完全可以忽略。

(2)方程1的x和z之间几乎是线性关系。

(3)两个曲面的交线近似是一条很平滑的空间曲线。

接下来,我们尝试画出这条曲线。代码如下:
syms x y zeq1=-2.*pi.*0.05415.*0.0000002.*sin(x).*sin((5.*pi./6)+x)-4./3.*pi.* ... 0.0000002.^3.*2000.*z.*9.78+2./3.*pi.*z.*9.78.*0.0000002.^3.* ... (1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.78.*0.0000002.^3.* ... (1820+1000)-pi.*z.*9.78.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ... (1820-1000).*(sin(x)).^2; eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.78.*(1820-1000)./0.05415).^ ... 0.5.*0.0000002.*sin(x))+(z.*9.78.*(1820-1000)./0.05415).^0.5.* ... y.*besselk(1,(z.*9.78.*(1820-1000)./0.05415).^0.5.*0.0000002.*sin(x));Z=solve(eq1,z);eq = subs(eq2, z, Z);hold onh = ezplot(eq, [0.52 0.53], [-1e-9 0]);X = get(h,'XData');Y = get(h,'YData');view(-10,35)grid onz = subs(Z, {x y}, {X Y});x(z>20000)=NaN;y(z>20000)=NaN;z(z>20000)=NaN;set(h, 'XData', X, 'YData', Y, 'ZData', z, 'linewidth', 2);title('')p=findall(gca,'type','patch');a=0.2;set(p,'Facealpha',a,'EdgeAlpha',a);得到的绘图结果如下:

对上面的代码,简单说明几点:
(1)可以单独运行,也可以接在前面的代码后面运行(单独运行时不画曲面);
(2)
(3)为了突出显示交线,把两个曲面设为半透明,如果不想要这两个曲面,可以直接在把代码的最后两行换成:
delete(p)axis tight即可删除曲面而只保留曲线。

以上程序在2007b上测试通过,其它环境暂未测试。
全部代码已作为附件上传,希望对楼主有帮助,如有问题可追问。

其实这个问题比较简单:在给定区间范围内绘制v=f(z,n)的曲面,公式是现成的,用meshgrid生成区域的座标点,然后代入公式计算,最后用mesh或surf之类的函数绘图即可。

 

唯一的问题是,v不仅是z和n的函数,还有一个自变量x。但x并非真正的独立变量,而是受另外两个三元方程约束的,对于给定的z,可以用question/577643560.html中的方法求出对应的x来。

 

你在空间贴出的代码是上述问题中的第一种方法。如果是用Maple内核的MATLAB(例如6.5或2007b,这两个版本上我做了测试),应考虑使用第二种方法,精度更高。

 

以下是代码,供参考(已作为附件上传):

% 绘图座标范围
ni = linspace(2, 100, 20);
zi = linspace(1, 20000, 30);

% 对于给定的z,求解对应的x
syms x y z 
eq1=-2.*pi.*0.05415.*0.0000002.*sin(x).*sin((5.*pi./6)+x)-4./3.*pi.* ... 
    0.0000002.^3.*2000.*z.*9.8+2./3.*pi.*z.*9.8.*0.0000002.^3.* ... 
    (1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.8.*0.0000002.^3.* ... 
    (1820+1000)-pi.*z.*9.8.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ... 
    (1820-1000).*(sin(x)).^2;  
eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.8.*(1820-1000)./0.05415).^ ... 
    0.5.*0.0000002.*sin(x))+(z.*9.8.*(1820-1000)./0.05415).^0.5.* ... 
    y.*besselk(1,(z.*9.8.*(1820-1000)./0.05415).^0.5.*0.0000002.*sin(x)); 
xi = sym( zi*0 ); 
yi = xi; 
for i = 1 : length(zi) 
    z0 = zi(i); 
    [xi(i), yi(i)] = solve(subs(eq1,z,z0), subs(eq2,z,z0)); 
end

% SOLVE的求解结果x位于要求的坐标范围之外,将其减小2*pi并转为数值类型
xi = double(xi-2*pi);

% 计算函数值
[n, z] = meshgrid(ni, zi);
[n, x] = meshgrid(ni, xi);
v = 2*0.05415*(-tan(5*pi/6+x-pi)./(((z*9.8*(1820-1000)/0.05415) ...
    .^0.5).*besselk(1,((z*9.8*(1820-1000)/0.05415).^0.5)*0.0000002 ...
    .*sin(x)))).^2.*((z*9.8*(1820-1000)/0.05415).^0.5).*besselk(1, ...
    ((z*9.8*(1820-1000)/0.05415).^0.5)*0.0000002.*n).*(1-1/3.* ...
    n.^-1+n.^-3-15/4.*n.^-4-4.46/1000.*(n-1.7).^-2.867)./(3*0.8937 ...
    /1000*0.0000002*1.0);


% 绘制曲面及标注图形
mesh(n, z, v)
view(30,15)
xlabel('n')
ylabel('z')
zlabel('v')

 

曲面效果如下图所示。



这么爱学习


matlab求助大神
1、确定迭代初值,即f(1)=0,f(2)=1,f(3)=3 2、确定迭代式,即 f(n)=f(n-1)+f(n-2)+f(n-3)3、使用for循环语句,求解f(4)~f(100)值。按上述方法编写程序代码,可以得到 f4=。。。f100=。。。执行结果

matlab求助大神,老是显示 Input argument "x" is undefined.
function optimization function f = myfun(x,d)function [c,ceq] = mycon(x,a,b,e)其中第一个函数,没有输入与输出。而且 ,楼主是否知道 调用function文件,不是点击文件里的run箭头,是在comand window 里输入 函数名字。而且,函数的输入要事先写好。不然就会出现 Input argument "x" is unde...

求助编程大神!!matlab
1、创建自定义极小值函数,其主要代码 if pc*pf>1024 %判断pc*pf是否小于等于1024 f1=inf;else f1=c\/pc*f\/pf;end 2、使用for循环语句,分别将c和f值赋值给自定义函数for i=1:5c=c0(i);f=f0(i);。。。end 3、使用ga函数求其pc和pf值,即A=[];b=[];Aeq=[];beq=[];lb=[0...

求matlab大神解答仿真问题
授人以鱼不如授人以渔, MATLAB的帮助文档里很容易查的哦~~建议在帮助中搜fft,其范例example就是很好的例子,直接看英文原文更详细。程序如下,模拟创建需要观察的信号 Fs = 1000; % Sampling frequency T = 1\/Fs; % Sample time L = 1000; % Length of signal t = (0:L-1)*T;...

求matlab大神帮忙注释下前面几句。 。。。老师留的作业
D2=bwdist(B1,'cityblock');%以菱形的方式计算矩阵B1中零点到非零点(即中心点)的最短距离,构造出一个新的几何体 for i=1:10 %循环10次 isosurface(D2,i), %提取出几何体D2中数值等于i的等值数据,并画出该等值面 axis equal,%产生等长坐标轴以显示图形 view(3)%设定3D观测点 axis...

求MATLAB大神帮忙
c1 = -0.8616 ;a2 = 0.6358 ;b2 = 0.008493 ;c2 = 0.03267;a3 = 0.1732;b3 = 0.04608;c3 = 0.5615 ;a4 = 0.1426 ;b4 = 0.0426 ;c4 = -0.9455 ;a5 = 0.03208 ;b5 = 0.07538 ;c5 = -1.325 ;a6 = 0.4631 ;b6 = ...

在线等,matlab解一元三次方程写完代码运行出错,请求大神帮助纠错
你解出来的x0,可能是很多值,你要从中找出符合条件的,你的条件是小于2的实数。那么你这里就少了一个循环,你必须把x0里面的值也都找一遍,才能出结果。我给你改完的代码是这样的:syms x L = 1:100;xFinal = zeros(100, 1);for i=1:length(L)x0 = solve('0.1125*tan(11*pi\/36)...

Matlab求大神帮忙啦……这个题不会做……怎么设计程序……我是小白...
兔子刚好在tk时间内跑到A点,即求解下面的方程:s = r0 * p\/(p^2-1)其中s=120为OA长度,r0=200为OB长度。解出p(注意取正数解)再乘以兔子速度即可。r0 = 200;Vt = 8;% 兔子移动的距离s = 120;% (1)猎狗最小速度% 钱杏芳,导弹飞行力学,北理工出版社,2000.8% p97,式4-11% ...

大神帮忙用MATLAB计算一个简单的指数方程啊,我计算的结果不对
直接用solve()函数来求解。>> t=solve('400=6600*(exp(-0.1155*t)-exp(-0.1386*t))')t =11.975497895220858489467001460145

大神求援助,有关matlab画出函数图像
大神求援助,有关matlab画出函数图像 5 [x,y,z]=dsolve('0.2*s*i+0.1*s*j-0.3*i=Di','0.3*i-Dr=Dj','-0.2*s*i-0.1*s*j=Ds','s+i+j+r=1','s(0)=0.98,i(0)=0.02,j(0)=0,r(0)=0','t');x=simple(x)出现的问题是:警告:Thenumbero... [x,y,z]=dsolve('0.2*s*i+0.1...

师河区14792252182: MATLAB中怎么把一个变成整数 -
荆苛铁龙: 使用int函数,有很多的uint8, uint16, uint32,uint64, int8, int32, int64, intmin, intmax,

师河区14792252182: matlab怎么把一个矩阵变成一行 -
荆苛铁龙: 比如矩阵A a=A(:) 则a将A的所有元素放在一行

师河区14792252182: matlab 中怎么将一个变量变成字符串 -
荆苛铁龙: names = who %这个可以以一个cell数组返回当前工作区间内的所有变量名 names = who('a*') %返回所有以a开头的变量名,“*”和“?”两个通配符含义同dos下 更多的用法去看help who

师河区14792252182: matlab怎么把一个行向量变成一个矩阵 -
荆苛铁龙: 好像没有直接能变成想要的函数,不过有个变维函数,reshape函数. 另外记住矩阵元素的排列是从上到下,从左倒右的,按照这个规则以及变维函数可以实现想要的功能: >> a=1:6 a = 1 2 3 4 5 6 >> b=reshape(a,3,2)' b = 1 2 3 4 5 6

师河区14792252182: 求问matlab中怎么把一个向量变成一个上三角矩阵 -
荆苛铁龙: z=f(x,y)=y^sinx*ln(x^2+y^2) ∂z/∂x=cosxy^(sinx)lnyln(x^2+y^2)+2xy^sinx/(x^2+y^2) ∂z/∂y=sinxy^(sinx-1)ln(x^2+y^2)+2yy^sinx/(x^2+y^2)

师河区14792252182: matlab中怎么把一个正数转为其相反数 -
荆苛铁龙: function b=inverse(a) if a>0 b=-a; else b=a; end return; 这个函数可以将你输入的数进行检验,如果为正数,将转换为它的相反数,如果为负数,将不变化

师河区14792252182: 在matlab中,怎样把一个二维矩阵转变成三维的,, -
荆苛铁龙: reshape函数可以帮你,比如 B=reshape(A,2,4,2); B就是你所求的新矩阵.

师河区14792252182: matlab,怎么把一个向量a(10)变成函数,,然后定义整数变量x,.可以调用y=a(x)+si -
荆苛铁龙: function out = a(in) data = vec; % 把原来向量a的值赋值在这里 out= vec(in); end 这样就可以了

师河区14792252182: matlab中,怎样将一个6*6的矩阵变成3*3?? -
荆苛铁龙: 使用reshape(X ,m,n)函数 reshape把指定的矩阵改变形状,但是元素个数不变使用reshpe后想得到b=[1 2 3 4 5 6 7 8 9] 只需要将a转置一下就

师河区14792252182: matlab用ode45的时候如果我要把一个变量变成function怎么办??? -
荆苛铁龙: 我用着完全没有问题啊,你再查查代码吧 function main_pro close all; clc; d=1; g=9.8; L=2; u=@(t)10*exp(-t^2/20).*sin(t^3); [T Y] = ode45(@(t,y)func(t,y,u,d,g,L),[0 3],1); % Solve ODE plot(T,Y); grid on; return function dy=func(t,y,u,d,g,L) ut = u(t); dy=ut*y*d/L; return

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网