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

article/2025/10/7 19:27:34

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]](*最小面积*)

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

出现了贴着x轴的情况

我们对原来的函数没有任何限制,出现这种情况是自然而然的。从这里看到,函数图像在 C1 上不连续。容易想到,我们可以利用分段艾米特插值或者样条函数插值避免这种情况的发生。
2. 做分段样条插值保证 C2 连续
- 由于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(xBA)

那么,理论上我们只要将两点带入反解出A、B的值即可。求解非线性方程组 f(x)=0 可以转化为求 fT(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]

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


http://chatgpt.dhexx.cn/article/ybqWyd2Q.shtml

相关文章

变分法模型的运用:生产设备的最大经济效益

上一节介绍了 动态优化模型/ 变分法 的基本思想&#xff0c;本节将一个变分法的运用。 目录 1 问题分析与假设 2 模型构造 3 模型求解 变分法习题 某工厂购买了一台新设备投入到生产中。一方面该设备随着运行时间的推…

简述变分法在泛函极值问题中的应用

此文主要有两部分内容&#xff0c;一部分是泛函的一些基本概念&#xff1b;第二部分是变分法在研究泛函极值问题中的应用。 第一部分 泛函 泛函是函数概念的一种扩充&#xff0c;函数描述的是从数到数的对应关系&#xff0c;从自变量到因变量的一种对应关系&#xff1b;而泛函…

变分法(欧拉 - 拉格朗日)和梯度下降求泛函最优解

泛函的简单理解&#xff1a; 是的变量&#xff0c; 这样的就叫泛函 . 加个积分&#xff0c;这样的就叫积分泛函 . 欧拉 - 拉格朗日 (E - L) 公式&#xff1a; 定义一个能量泛函如下&#xff1a; 我们的目的是找到能使 取到极值的时候 的取值&#xff0c;所以我们就假设 就…

第二章-最优控制中的变分法(经典变分法或古典变分法)1

是《最优控制理论与应用(邵克勇&#xff0c;王婷婷&#xff0c;宋金波)》的读书笔记&#xff0c;相比于其他的书&#xff0c;选择这本书的理由是页数少&#xff0c;能读完。解学书的《最优控制理论与应用》看目录感觉很全&#xff0c;但是太厚了&#xff0c;感觉看不完。 虽然…

变分法理解1——泛函简介

变分法是处理泛函的数学领域&#xff0c;和处理函数的传统微积分相对。 对泛函求极值的问题称为变分问题&#xff0c;使泛函取极值的函数称为变分问题的解&#xff0c;也称为极值函数。 传统的微积分中的一个常见的问题是找到一个 x x x 值使得 y ( x ) y(x) y(x) 取得最大值…

变分法证明两点之间线段最短

传送门https://zhuanlan.zhihu.com/yueaptx 变分法简介Part 1.&#xff08;Calculus of Variations&#xff09; Dr.Stein 计算力学 ​关注他 283 人赞了该文章 泛函数 (Functionals) 简而言之&#xff0c;泛函数是函数的函数&#xff0c;即它的输入是函数&#xff0c;输出…

最优控制理论 一、变分法和泛函极值问题

变分法是最优控制问题的三大基石之一&#xff0c;下面讨论一些变分法的常用理论。 1. 性能指标泛函 无约束最优控制问题&#xff0c;若固定起止时间&#xff0c;两端状态固定&#xff0c;即 x ( 0 ) x 0 , x ( t f ) x f , t ∈ [ 0 , t f ] x(0)x_0, x(t_f)x_f, t\in[0,t…

[变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明

[变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明 变分法 费马光学原理最速下降线问题旋轮线旋轮线最速下降性质的证明一些旋轮线及变形参考书目:1696年约翰伯努利在写给他哥哥雅克布伯努利的一封公开信中提出了如下的“捷线”问题:设想一个质点沿连接…

深入浅出解析变分法——一种常用的数学方法

前言&#xff1a;笔者从事图像处理行业&#xff0c;总是接触到变分法这个概念&#xff0c;一直没有很深入的去理解这个概念&#xff0c;同时我看其他大佬的博文也比较糊涂&#xff0c;因此最近花了一些时间好好梳理了这部分数学知识。文章共3部分&#xff0c;主要是对变分法的解…

变分法:在图像处理中的应用(一)

前言 最近学习稠密重建的相关知识&#xff0c;发现变分法通常作为一个平滑的正则项出现在残差平方和的损失函数中。而图像处理中又经常出现这类最小损失函数的优化问题&#xff0c;如图像分割、稠密光流、稠密重建等等&#xff0c;这些优化问题中都有可能涉及到变分法。因此&am…

电磁仿真原理——3. 变分法(Variationl Methods)

目录 引言线性空间的算子问题变分的计算问题欧拉公式 构造泛函的方法利用分部积分构造利用标准变分原理构造 瑞利一里茨法加权留数法本征问题变分的实际应用 引言 由于课程后面重点的矩量法和有限元法都是基于变分法进行的&#xff0c;变分法是它们的数学基础&#xff0c;实际…

泛函极值问题与变分法

泛函与泛函极值问题 平面内两点A&#xff0c;B&#xff0c;连接两点之间的曲线有很多种方式。分别用函数 f i ( x ) f_{i}(x) fi​(x)来表示。对于给定的曲线 f i ( x ) f_{i}(x) fi​(x), 那么两点之间连线的长度可以表示为 J ( f i ( x ) ) ∫ A B 1 f i ′ ( x ) 2 d x J…

【Matlab】变分法求控制器(无约束)

在动态最优控制中&#xff0c;目标函数是一个泛函数&#xff0c;求解动态最优化问题可以看做是求泛函极值的问题&#xff0c;求解泛函极值有一个方法&#xff0c;即变分法&#xff0c;本文章便介绍有关变分法的一些自己的学习理解。 变分法的基本概念 泛函 如果一个因变量的…

关于变分法

在介绍变分贝叶斯之前&#xff0c;首先以这篇博客介绍下大名鼎鼎的变分法。 参考资料主要是知乎的文章与维基百科。 变分就是函数的微分。 回顾一下传统的函数优化问题。 对于 min ⁡ x f ( x ) \min_x f(x) minx​f(x)这样的优化问题&#xff0c;求取最优的 x x x的做法常用…

变分法

变分法 弦平衡方程的导出&#xff0c;建立起横向位移u&#xff0c;张力T&#xff0c;外力f之间的关系&#xff1a; 方一、根据受力平衡导出 推导时用的技巧或假设&#xff1a; 1.泰勒展开近似 同理 2. 3.小变形假设&#xff0c;张力均匀&#xff0c;即 4.方程推导中忽略二…

变分法入门介绍

文章目录 变分法入门介绍泛函和变分法变分法求泛函极值变分的定义拉格朗日函数欧拉方程 案例分析--两点之间直线最短在Mathematica中使用变分法参考文献 变分法入门介绍 读完这篇博文你可以了解变分的基本概念&#xff0c;以及使用变分法求解最简泛函的极值。本文没有严密的数…

能量原理和变分法笔记1:变分法简介

上个学期在学校学了多体系统动力学的课&#xff0c;其中老师讲了变分原理&#xff0c;觉得很有启发&#xff0c;决定再学学相关的知识&#xff0c;在B站找到了一个这样的视频能量原理与变分法&#xff0c;做点笔记&#xff0c;加深一下理解。 第0章序言-微元、功和能(P2) 第1章…

机器学习——变分法、拉格朗日乘子

文章目录 一、变分法二、Lagrange 乘子2.1 一般约束的拉格朗日乘子2.2 带不等式约束的拉格朗日乘子2.3 多约束问题 一、变分法 引入 函数 y ( x ) y(x) y(x) 可以看成一种操作符&#xff0c;即对于任意 x x x&#xff0c;返回一个输出 y y y。在这种情况下&#xff0c;我们…

动态优化模型/ 变分法:泛函、极值、变分

目录 1 变分法的基本概念 1.1 泛函 1.2 泛函的极值 1.3 泛函的变分 1.4 极值与变分 1.5. 变分法的基本引理 2 无约束条件的泛函极值 2.1 端点固定的情况 2.2 …

变分法 (Calculus of Variations)

Contents 泛函 (functional)Calculus of VariationsReferences 泛函 (functional) 泛函 F [ y ] F[y] F[y] 是函数的函数&#xff0c;即它的输入是函数 y ( x ) y(x) y(x)&#xff0c;输出是实数 F F F。这个输出值取决于一个或多个函数 (输入) 在一整个路径上的积分而非像…