mathematica求解最小面积旋转曲面

做你没做过的事叫成长,做你不愿做做的事叫改变,做你不敢做的事叫突破。—— 巴菲特

问题描述

在一条直线的同一侧有两个已知点,试找出一条连接这两点的曲线,使这条曲线绕直线旋转所得的曲面面积最小。

  1. 插入等n个等分节点,中间n-1个节点y值用未知数表示。用类似于求最速降线的方法,在每一个小区间上进行线性插值。 利用旋转曲面表面积公式求得每一段区间上圆台侧面积,加和求极小值,以求得未知的y值。代码如下:
(*分段线性插值方法求最小旋转曲面面积*)
area[{a1_, h1_}, {a2_, h2_}] := Block[{S, R, r, L}, R = h1; r = h2;L = Sqrt[(h2 - h1)^2 + (a2 - a1)^2];S = Pi*(R + r)*L;S];(*输入两点,求过这两点和x轴围城的梯形面积*)
x0 = 0; d0 = 9;
xn = 7; dn = 2;(*输入两点坐标*)
n = 30; dx = (xn - x0)/n;
partitionPs = Table[{x0 + dx*i, y[i]}, {i, 1, n - 1}];
PrependTo[partitionPs, {x0, d0}];
AppendTo[partitionPs, {xn, dn}];(*表示出划分成n份后每点的坐标*)
partS = Table[area[partitionPs[[i - 1]], partitionPs[[i]]], {i, 2, n + 1}];(*求每一小块梯形的面积*)
S = Total[partS];(*将每一小块梯形面积求和*)
initialvalue = Table[{y[i], d0 + i*(dn - d0/n)}, {i, 1, n - 1}];(*两点间的线性划分作为初值*)
result = FindMinimum[{S, Table[y[i] > 0, {i, 1, n - 1}]}, initialvalue];(*求使总面积为极小值的未知数y*)
pic1 = ListPlot[partitionPs /. result[[2]], PlotRange -> Full, Joined -> True]
minarea = S /. result[[2]](*最小面积*)

但是我们在调整两点坐标时,发现出现了如下情况:

我们对原来的函数没有任何限制,出现这种情况是自然而然的。从这里看到,函数图像在C1C^1上不连续。容易想到,我们可以利用分段艾米特插值或者样条函数插值避免这种情况的发生。
2. 做分段样条插值保证C2C^2连续
- 由于mathematica自带的样条插值不能进行符号运算,我们只能自己构造样条插值函数
- 三对角矩阵可以用利用稀疏矩阵函数SparArray来产生
- 及时清除变量值,以保证下一次运行不出错。如有必要,需重启软件,初始化内核
- 由于mathematica自带的积分函数计算速度太慢,分段一多,几乎无法等待,所以可以考虑使用辛普森公式来近似估计每一段旋转曲面面积,以求加和最小

(*三次样条插值方法求最小旋转曲面侧面积*)
Clear[lambda, mu, X, M, y, pics, area];(*清除变量*)
n = 3;(*设置分段数*)
x[0] = 0;
y[0] = 8;
x[n] = 5;
y[n] = 7;(*输入两点坐标*)
pics = Array[f, n]; pics2 = Array[0, n];(*定义数组,用于存图*)
h = (x[n] - x[0])/n;
d[0] = 0; d[n] = 0;(*样条插值三对角方程右端项在补充自然边界条件是置为0*)
lambda[0] = 0; mu[n] = 0;(*三对角矩阵中的lambda0和mu0为0,其余都为1/2*)
Table[x[i] = x[0] + i*h, {i, 1, n - 1}];(*等距划分x轴*)
X = SparseArray[{{i_, i_} -> 2, {i_, j_} /; Abs[i - j] == 1 && i != 1 && i != n + 1 -> 1/2}, {n + 1, n + 1}];(*使用稀疏矩阵生成三对角矩阵*)
MatrixForm[X](*三对角矩阵矩阵形式展示*)
Table[d[i] = 3/h^2*(y[i + 1] - 2*y[i] + y[i - 1]), {i, 1, n - 1}];(*循环生成含未知数的d*)
L = LinearSolve[X, Table[d[i], {i, 0, n}]];(*求解方程Xx=d*)
Table[M[i] = L[[i + 1]], {i, 0, n}];(*求得弯矩M,即各分点的二阶导数值*)
Table[A[i] = (y[i + 1] - y[i])/h - h/6*(M[i + 1] - M[i]);B[i] = y[i] - M[i]*h^2/6;S[i + 1] = 1/(6*h)*(x - x[i])^3*M[i + 1] - 1/(6*h)*(x - x[i + 1])^3*M[i] + A[i]*(x - x[i]) + B[i], {i, 0, n - 1}];(*将弯矩M代入公式,求得每一小段上的样条插值函数*)
area = Sum[2 Pi*h/6*(((S[i]*Sqrt[1 + D[S[i], x]^2]) /. x -> x[i - 1]) + ((S[i]*Sqrt[1 + D[S[i], x]^2]) /. x -> x[i]) + ((4*S[i]*Sqrt[1 + D[S[i], x]^2]) /. x -> (x[i] - h/2))), {i, 1, n}];
(*由旋转体面积公式求得侧面积*)
yy0 = Table[{y[i], y[0] + i*(y[n] - y[0])/n}, {i, 1, n - 1}];(*求极值的初值*)
result = FindMinimum[{area, Table[y[i] > 0, {i, 1, n - 1}]}, yy0];(*求解极值点*)
Table[pics[[i]] = Plot[S[i] /. result[[2]], {x, x[i - 1], x[i]}], {i, 1, n}];
Show[pics, PlotRange -> All](*绘图*)
Table[pics2[[i]] = RevolutionPlot3D[S[i] /. result[[2]], {x, x[i - 1], x[i]}, RevolutionAxis -> "X"], {i, 1, n}];
Show[pics2, PlotRange -> Automatic](*绘图*)
result(*求得最小面积*)


3. Mathematica变分法求解最小面积旋转曲面

理论证明,最小旋转曲面函数是双曲余弦函数:

y=Acosh(x−BA)

y=Acosh( \frac{x-B}{A})
那么,理论上我们只要将两点带入反解出A、B的值即可。求解非线性方程组 f(x)=0f(x)=0可以转化为求 fT(x)f(x)f^T(x)f(x)最小值的问题。使用RevolutionPlot3D命令可画出旋转图形。

变分法代码
(*变分法求最小旋转曲面面积*)
ch[x_, y_] := Cosh[(x - B)/A]*A - y;(*定义一般的最小面积双曲余弦曲线*)
x0 = 0; y0 = 8;
xn = 5; yn = 7;(*给定两点坐标*)
ContourPlot[{ch[x0, y0] == 0, ch[xn, yn] == 0}, {A, -30, 30}, {B, -30,30}](*绘制将AB视为变远时的两点代入的图像,观察交点*)
psbsol = NSolve[{ch[x0, y0] == 0, ch[xn, yn] == 0}, {A, B}, Reals];
(*当图像有交点时,表明方程组有解,可用Nsolve求解非线性方程组,速度较慢*)
(*result=NMinimize[ch[x0,y0]^2+ch[xn,yn]^2,{A,B}]
FindRoot[{ch[x0,y0]\[Equal]0,ch[xn,yn]\[Equal]0},{A,1},{B,1}] \
适当改用这两种方式求解最优值,可提高速度*)
If[psbsol != {},(*讨论当方程组解集非空的情况*)area = {}; lines = {};For[i = 1, i <= Length[psbsol], i++, temp = (Cosh[(x - B)/A]*A) /. psbsol[[i]]; AppendTo[lines, temp];AppendTo[area, 2*Pi*NIntegrate[temp*Sqrt[1 + D[temp, x]^2], {x, x0, xn}]]];(*分别求方程组两个解对应的解曲线和旋转面积*)index = Ordering[area][[1]];(*求最小旋转面积在所有解集中的位置*)minarea = area[[index]];(*最小旋转面积*)minline = lines[[index]];(*最小旋转曲线*)pic1 = Plot[minline, {x, x0, xn}];pic2 = RevolutionPlot3D[minline, {x, x0, xn}, RevolutionAxis -> "X"];(*绘图*)]
If[psbsol == {},(*当图像无交点时表明原方程组无解,此时用另外的方法得到结果*)result = NMinimize[ch[x0, y0]^2 + ch[xn, yn]^2, {A, B}];(*求极值作为最小值*)minline = Cosh[(x - B)/A]*A /. result[[2]];pic1 = Plot[minline, {x, x0, xn}];pic2 = RevolutionPlot3D[minline, {x, x0, xn}, RevolutionAxis -> "X"];minarea = 2*Pi*NIntegrate[minline*Sqrt[1 + D[minline, x]^2], {x, x0, xn}]]
minarea
minline
Show[pic1]
Show[pic2]

连蒙带猜,学会折腾 —— 赵永成

mathematica变分法和样条插值求解最小旋转曲面相关推荐

  1. 变分法和变分贝叶斯推断

    本文转载的原文链接:变分法和变分贝叶斯推断 另一篇CSDN链接学习:变分贝叶斯推断(Variational Bayes Inference)简介 变分法是17世纪末发展起来的一门数学分支,是泛函分析里 ...

  2. 共轭梯度下降法matlab,用matlab实现最速下降法,牛顿法和共轭梯度法求解实例

    用matlab实现最速下降法,牛顿法和共轭梯度法求解实例 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验的题目和要求 1.所属 ...

  3. 求解最小机器重量(回溯法/分支限界)

    求解最小机器重量(回溯法/分支限界) 回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用DFS深度优先,会马上得到一个结果,然后比较当前选择的重量 ...

  4. 使用dijkstra求解最小费用最大流网络

    前言 在介绍如何使用dijkstra算法求解最小费用最大流问题的时候,假设看这篇博文的读者已经知道什么是最小费用最大流问题及熟悉dijkstra单源最短路径算法.在这篇博文里面,我并不会过多强调网络拓 ...

  5. 用共轭梯度法求极小值matlab,用MATLAB实现最速下降法_牛顿法和共轭梯度法求解实例——张小强.doc...

    机电产品优化设计 课程设计报告 姓 名 :张 小 强 学 号 :201222080633 学 院 :机械电子工程学院 实验的题目和要求 一.课程名称:最优化设计方法 二.实验日期:2013年6月27日 ...

  6. matlab最小费用最大流函数,使用matlab求解最小费用最大流算问题

    <使用matlab求解最小费用最大流算问题>由会员分享,可在线阅读,更多相关<使用matlab求解最小费用最大流算问题(8页珍藏版)>请在人人文库网上搜索. 1.北京联合大学实 ...

  7. matlab 变分贝叶斯,变分法和变分贝叶斯推断

    变分法介绍 变分法是17世纪末发展起来的一门数学分支,是泛函分析里面的一个领域,在普通的最优化问题中,往往求解得到的是一个最优值解,而在一个变分问题中,求解得到的是一个最优函数解,因此变分问题可以看成 ...

  8. 算法竞赛——给定ATCG的DNA环状序列,求解最小表示字典序(附python代码及时间复杂度解析)

    题目:环状序列表示一般都会有很多种,比如一个环'CCTC',它的表示方法可能会有很多种,比如,CCTC,CTCC,TCCC,CCCT.这几种表示中,找出字典序最小的表示序列.(字符串只由A.T.G.C ...

  9. 赫夫曼树及求解最小WPL的实现

    赫夫曼树 定义: 假设有m个权值{W1,W2,...Wm},可以构造一颗含有n个叶子节点的二叉树,每个叶子节点的权为Wj,则其中树的带权路径长度即WPL最小的二叉树称作最优二叉树或赫夫曼树. 算法思想 ...

  10. 回溯法求解最小机器重量设计问题

    回溯法介绍 回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯",尝试别的路径. 它适合于解一些组合数较大的最优化问题 ...

最新文章

  1. 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan
  2. 网管常犯的十个错误-转载
  3. 高软作业三:原型化设计——随心记
  4. SparkSQL之关联mysql和hive查询
  5. ubuntu下超级用户和普通用户
  6. OpenCV积分图函数:integral ()介绍
  7. React 事件处理函数
  8. Xcode - Plugins And Themes
  9. AI会取代CPDA数据分析师吗?
  10. chrome浏览器Flash版本过低解决方法
  11. vl53l1x+stm32激光测距分析(待修改)
  12. 自制java虚拟机_《深入理解Android:Java虚拟机ART》 —1.2.3 准备模拟器和自制系统镜像...
  13. 11.判断一个人出生了多少天
  14. 一文了解 TKG 如何使用 GPU 资源池
  15. 扬帆际海—shopee跨境店和本土店谁更有优势?
  16. SQL注入学习日记(一)
  17. 基于身份的常数级环签名
  18. 小程序开发:小程序的wxs的使用
  19. Mockito中模拟静态方法
  20. 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )

热门文章

  1. SpringBoot自动解压Gzip请求
  2. RFC2544优化步长测试——信而泰网络测试仪实操
  3. 常用的Shell脚本集合
  4. Spring 事务和事务传播机制
  5. Python图像增强之直方图均衡化(全局直方图均衡、局部直方图均衡)
  6. mysql 如何避免间隙锁_mysql 间隙锁
  7. csdn ruby语言入门_Ruby编程语言入门指南
  8. C4D-学习笔记-3-建模+渲染
  9. linux卸载bzip2,bzip2命令_Linux bzip2命令:压缩和解压文件(.bz2文件)
  10. 车路协同科研教学与实训先导平台 ——一种面向新一代智能交通人才培养的综合实验平台及系统