n身体模拟C#
我正在尝试使用runge kutta 4或Velocity Verlet Integration算法在C#中实现N身体模拟. 在转到更多的粒子之前,我想通过对围绕太阳的地球轨道进行建模来测试模拟,但是,由于某种原因,我会得到一个怪异的螺旋. 我无法弄清楚这个问题,因为我使用相同的算法对太阳系进行了更简单的模拟,在该算法中,太阳被固定在适当的位置并且一切都可以完美地效果.集成商的工作非常完美,因为我使用的是哪一个,我都会与两者相处. 任何帮助将不胜感激. 这是代码: class NBODY { public static double G = 4 * Math.PI * Math.PI; class Particle { public double[] r; // position vector public double[] v; // velocity vector
2 2024-01-23
编程技术问答社区
符号式与数字式的数学表现
与数字计算相比,符号数学计算(尤其是用于解决非线性多项式系统)是否会导致巨大的性能(计算速度)劣势?有任何基准/数据吗? 找到了一个相关问题:符号计算与数字计算 另一个: forward的计算效率模式自动与数字与符号分化 解决方案 我是一个人,他回答了您在问题中提到的Scicomp问题.我个人不知道是否有任何经验指标将符号和数值解决方案的运行时间性能与多项式方程系统进行比较. 但是,对于大多数解决问题的方面,符号解决方案的开销将相当直观,这是由于方程式中的术语操纵诸如象征性的术语,搜索如何简化/重新安排方程式以使它们更容易使它们更容易,从而使它们更容易.要解决,搜索已知的封闭形式解决方案等.符号求解器的一个主要问题是,您可能没有可以找到和使用的封闭形式解决方案,因此以数值为单位进行求解. > 我看到的符号求解器在运行时的符号求解器的表现优于数值解决方案,即符号求解器是否可以足够快速地将您的问题识别为具有已知分析解决方案的问题,或者最终在数值求解器时到达解决方
固定点数学比浮点数学快吗?
几年前,在1990年代初期,我构建了图形包,该图形包基于固定点算术和预计的表,用于COS,SIN和缩放方程,用于SQRT和Log近似,并使用Newton的近似方法进行了计算.这些先进的技术似乎已成为图形和内置数学处理器的一部分.大约5年前,我参加了一个数值分析课,该课程涉及一些旧技术.我已经编码了将近30年,即使在为世界一流的粒子加速器实验中的GPGPU应用程序工作之后,也很少看到使用的旧固定点优化.固定点方法是否仍然有用,在整个软件行业的任何地方,还是该知识的有用性永远消失了? 解决方案 固定点在不支持其自己的小数类型的平台上略有用.例如,我为PIC16F系列微控制器实现了24位固定点类型(更多地介绍了为什么我稍后选择固定点). 然而,几乎每个现代CPU都支持微型或硬件级别的浮点,因此固定点不需要太多. 固定点号在它们可以表示的范围内受到限制 - 考虑64位(32.32)固定点与64位浮点:64位固定点号的十进制分辨率为1/(2 32 ),而浮点数的十进制分辨率为
8 2024-01-23
编程技术问答社区
区域体积的Python数值积分
对于程序,我需要一种算法来快速计算固体的体积.该形状由一个函数指定,如果p(x,y,z)给定点,则返回1,如果p是固体点的点,如果p不是固体的点,则返回0. . 我尝试使用以下测试使用Numpy: import numpy from scipy.integrate import * def integrand(x,y,z): if x**2. + y**2. + z**2.
2 2024-01-23
编程技术问答社区
Matlab Euler Explicit ode solver with adaptable step, 有什么方法可以使代码更快?
我正在尝试找到一种使此代码更快的方法. nagumo1是计算时间t. 的两个衍生物值的函数 function x = nagumo(t, y, f) Iapp = f(t); e = 0.1; F = 2/(1+exp(-5*y(1))); n0 = 0; x = zeros(2, 1); z(1) = y(1) - (y(1).^3)/3 - y(2).^2 + Iapp; %z(1) = dV/dt z(2) = e.*(F + n0 - y(2)); %z(2) = dn/dt x = [z(1);z(2)]; end 它是一个微分方程的系统,它代表了神经元的很大简化模型. V表示电势的差异,n表示K+/Na+运河的数量,而IAPP是应用于神经元的电流.时间变量(t)在毫秒中测量. 我想使用具有可变步长的Euler显式方法来解决微分方程系统并将解决方案绘制. function x = EulerExplic
0 2024-01-23
编程技术问答社区
健全的多边形法线计算
是否有良好的鲁棒算法来计算凸多边形的正常矢量(当然为3D)?对于三角形,这很容易:一个采用两个三角形的边缘并计算跨产品: vec3 u = point[0] - point[1], v = point[0] - point[2]; vec3 n = normalize(cross(u, v)); 但是,这种方法并不能很好地扩展到多边形.多边形的某些边缘几乎可以是"完全"的共线(这通常会发生在发生T型卸下的网格中),因此有必要选择一对边缘,给出"强"的正常状态(这两个边缘都是"足够长",它们保持"几乎垂直"角度). 这种方法仍然对所有多边形都不适用.想象一下圆盘形状的多边形.如果非常细微地细分,所有边缘都将非常短,并且所有连续的边缘几乎都是界点,无论盘的半径如何.同时,普通定义很好. 一种解决方案可能是找到最大的铭刻三角形并计算出正常情况.但是,发现它具有O(n^2)的复杂性,这似乎很过分. 一个更好的解决方案可能是使用SVD或特征值分解来计算正常,鉴于所有多边
2 2024-01-22
编程技术问答社区
产生2的平方根的数字
我想生成两个到 300万位数字的平方根的数字. 我知道 newton-raphson ,但我没有由于缺乏BigInteger支持,因此对如何在C或C ++中实施它.有人可以将我指向正确的方向吗? 另外,如果有人知道如何在Python(我是初学者)中做到这一点,我也会很感激. 解决方案 您可以尝试使用映射: a/b -> (a+2b)/(a+b)从a= 1, b= 1开始.这将收敛到SQRT(2)(实际上给出了其持续的分数表示). 现在关键点:这可以表示为矩阵乘法(类似于fibonacci) 如果a_n和b_n是步骤中的第n个数字,则 [1 2] [a_n b_n] t = [a_(n+1)b_(n+1)] t [1 1] 现在给我们 [1 2] n [a_1 b_1] t = [a_(n+1)b_(n+1)] t [1 1] 因此,如果2x2矩阵为a,我们需要计算 n ,可以通过重复平方来完成,并且只使用整数算术(因此您不
0 2024-01-22
编程技术问答社区
并行计算Pi的快速算法
我开始学习cuda,我认为计算PI的长位数将是一个不错的入门项目. 我已经实现了简单的蒙特卡洛方法,该方法很容易并行化.我只是让每个线程随机生成单位正方形上的点,弄清楚单位圆中的多少位,然后使用还原操作对结果进行计数. ,但这当然不是计算常数的最快算法.以前,当我在单个螺纹CPU上进行此练习时,我使用 Machin-like类似公式进行更快的收敛速度计算.对于有兴趣的人,这涉及将PI表示为Arctangents的总和,并使用Taylor系列来评估表达. 这种公式的示例: 不幸的是,我发现将此技术平行于成千上万的GPU线程并不容易.问题在于,大多数操作只是进行高精度数学,而不是对数据的长量向量进行浮点操作. 所以我想知道,什么是在GPU上计算PI任意长数字的最有效方法? 解决方案 您应该使用为什么?首先,您需要一种可以分解的算法.因此,我想到的第一件事是将PI表示为无限的总和.然后,每个处理器都只能计算一个学期,您最终将它们总结. 那么,最好每个
10 2024-01-22
编程技术问答社区
实现数学公式时的溢出问题
我听说,当计算平均值时,start+(end-end-start)/2与(start+end)/2有所不同,因为后者会导致溢出.我不太明白为什么第二个会导致溢出,而​​第一个则不会引起溢出.实现可以避免溢出的数学公式的通用规则是什么? 解决方案 假设您正在使用一台计算机,其中最大整数值为10,并且要计算5和7的平均值. 第一种方法(Begin +(End-Bengin)/2)给出 5 + (7-5)/2 == 5 + 2/2 == 6 第二种方法(begin + end)/2给出了溢出总结为零,但是如果您的号码已签名,则可能会得到负数!). 12/2 => overflow occurs => 2/2 == 1 当然,在真实的计算机中,整数以2^32而不是10的巨大值溢出,但是这个想法是相同的.不幸的是,没有"一般"的方法可以摆脱我所知道的溢出,这在很大程度上取决于您使用的特定算法.然后,事情变得更加复杂.您可以根据引擎盖下使用哪种数字类型来获得不同的行
0 2024-01-22
编程技术问答社区
如何非常快地找到二进制对数? (最多是O(1))
是否有任何非常快的方法可以找到整数编号的二进制对数?例如,给定一个数字 X = 5265614583427859334895901384184183521615944777777777777455555555488768必须找到y = log = log = log(x,2),x,2始终是215. x. 问题似乎真的很简单.所需要的只是找到最重要的1位的位置.有一个众所周知的方法地表,但它不是很快,尤其是对于非常长的多字整数. 最快的方法是什么? 解决方案 快速黑客:大多数浮点数表示自动化值,这意味着它们有效地执行循环 Christofferhammarström在硬件中提到了.因此,只要数字在fp表示的指数范围内,就可以简单地从整数转换为fp并提取指数. (在您的情况下,整数输入需要多个机器单词,因此需要在转换中执行多个" shifts".) 其他解决方案 如果整数存储在A uint32_t a[]中,那么我的明显解决方案将如下: 在a[]上运行线性搜索,
0 2024-01-22
编程技术问答社区
随机抽取三角形中的一个点
假设您有一个任意三角形的顶点A,B和C. 本文(第4.2节)说您可以生成一个随机点,P,通过以下顶点组合从三角形ABC内均匀: P = (1 - sqrt(r1)) * A + (sqrt(r1) * (1 - r2)) * B + (sqrt(r1) * r2) * C 其中r1和r2均匀地从[0, 1]中绘制,而sqrt是平方根函数. 您如何证明三角形内的采样点均匀分布?ABC? 编辑 正如在 Mathoverflow问题的评论中所指出的. 图形gems讨论了这种算法 解决方案 您从单位正方形到三角形的地图P(R1,R2).在单位正方形中选择R1和R2均匀地给出一个随机点.三角形中的图像是根据地图P的雅各布决定因素分配的,该图是一个常数.因此,图像分布也均匀. 实际上,要验证这一点,您只需要检查一个三重的非共线点a,b,c.仿射线性地图具有恒定的雅各布式,因此您可以应用其中之一将任意三倍移动到该标准位置而不会影响分布. 最后,一个关于"为什
2 2024-01-22
编程技术问答社区
用C/C++实现导数
A f(x)的导数通常是通过编程方式计算的,以确保最高精度? 我正在实施 newton-raphson功能. 解决方案 我同意@erikkallen的观点,即(f(x + h) - f(x - h)) / (2 * h)是数值近似衍生物的常用方法.但是,获得正确的步长h有点微妙. (f(x + h) - f(x - h)) / (2 * h)降低随着h的变化而减小的近似误差,这说您应该服用h尽可能小.需要减去几乎相等的数字.如果h太小,您可以在减法中放松很多精度.因此,实际上,您必须选择一个不太微小的值h,以最大程度地减少近似错误和数值错误. 作为经验法则,您可以尝试h = SQRT(DBL_EPSILON)其中DBL_EPSILON是最小的双精度编号e,以便在机器精度中1 + e != 1. DBL_EPSILON大约10^-15,因此您可以使用h = 10^-7或10^-8. 有关更多详细信息,请参见以下更重要的是,如果您想要非常准确的结果,则可以使用
2 2024-01-22
编程技术问答社区
如何在VS 2010中使用BigInteger
我一直在尝试使用BigInteger类型,该类型据说是.NET Framework 4.0. 我似乎无法达到它,并在尝试通过使用System.Numerics. 来引用错误. 知道我做错了什么?抱歉,如果这是一个愚蠢的问题... 解决方案 添加参考到 system.numerics 汇编到您的项目. a.在解决方案资源管理器中,右键单击项目节点,然后单击添加参考. b.在添加参考对话框中,选择 .net tab. c.选择 system.numerics ,然后单击 ok . 添加使用指令导入> system.numerics 名称空间: using System.Numerics; 使用 biginteger结构: var i = new BigInteger(934157136952); 其他解决方案 您是否添加了system.numerics的引用? 右键单击引用 - >添加参考 - > .net选项卡 -
0 2024-01-07
编程技术问答社区
如何使用DotNumerics解决线性编程问题?
我对数值分析非常感兴趣.我一直在使用dotnumerics开源应用程序.我的线性系统如下: 1 * x + 3 * y = 0, y >= 0 z = 10 * x + 15 * y 我正在尝试解决z(优化...) 我可以在此链接中使用上述问题来解决上述问题.我也给作者发送了电子邮件,但是他尚未回答. using DotNumerics.Optimization; using DotNumerics; namespace App.SimplexCalcLinearProgramming { class Program { static void Main(string[] args) { Simplex simplex = new Simplex(); double[] initialGuess
4 2024-01-05
编程技术问答社区
c#-解决复杂的ODE集
简介 某些集合OD ODE无法分析解决.在这种情况下,有很多知识的方法,尤其是在MATLAB等典型的科学软件中.只要您留下来,一切都很好.但是,如果您尝试将此功能移植到其他环境,则问题开始.就我而言,我需要在c#. 中 一些细节 当然,有一些ode的c#libs,但在大多数情况下(至少在我熟悉的情况下),有很少的有限.让我们看一下奥斯陆库,这是一个示例查询: var sol = Ode.RK547M(0, new Vector(5.0, 1.0), (t, x) => new Vector( x[0] - x[0] * x[1], -x[1] + x[0] * x[1])); 如您所见,它不允许提供任何其他支持非AD方程,也不允许嵌入算法.如果我们必须这样解决这样的设置,那么有限的是有限的: a=x*2+7 b=y*x+3 c- need to be calculated with external algorithm basing and "b" and "x" d
2 2024-01-04
编程技术问答社区
__builtin_prefetch, 它能读多少?
我正在尝试优化一些C ++(__builtin_prefetch 我无法弄清楚如何预取整个结构. 我不明白读取多少const void *addr.我想将下一个from和to加载的值. for (int i = from; i px- from->px; double delta = from->r + to->r - pos; double k1 = axcel(kv, delta, from->mass) * dt; //axcel is an inlined function
4 2023-12-16
编程技术问答社区
如何在Mathematica 8中进行并行积分
有人有想法如何使用所有内核来计算集成?我需要使用并行的或并行表,但是如何? f[r_] := Sum[(((-1)^n*(2*r - 2*n - 7)!!)/(2^n*n!*(r - 2*n - 1)!))* x^(r - 2*n - 1), {n, 0, r/2}]; Nw := Transpose[Table[f[j], {i, 1}, {j, 5, 200, 1}]]; X1 = Integrate[Nw . Transpose[Nw], {x, -1, 1}]; Y1 = Integrate[D[Nw, {x, 2}] . Transpose[D[Nw, {x, 2}]], {x, -1, 1}]; X1//MatrixForm Y1//MatrixForm 解决方案 如果首先通过扩展矩阵元素来帮助积分一点, 事情可以通过一点点努力来完成. 在带有Windows和Mathematica的四核笔记本电脑上8.0.4以下代码运行 对于
4 2023-12-11
编程技术问答社区
在一个C++库中快速实现梯度白化?
我希望运行梯度下降优化,以最大程度地减少变量实例化的成本.我的程序在计算上非常昂贵,因此我正在寻找一个受欢迎的库,并快速实施GD.推荐的库/参考是什么? 解决方案 gsl 是一个很棒的(免费)库,它已经实现了常见的功能数学和科学利益. 您可以仔细阅读整个参考手册在线.四处逛逛,有趣的是,但我认为我们需要更多地了解这个问题. 其他解决方案 听起来您是最小化方法的新手.每当我需要学习一组新的数字方法时,我通常会以例如,如果您的功能成本高昂,那么您的目标是最大程度地化需要收敛的评估次数.如果您对梯度具有分析表达式,那么基于梯度的方法可能会对您有利,假设功能及其梯度在感兴趣的领域中表现良好(缺乏奇异性). 如果您没有分析梯度,那么使用 Downhill Simplex 仅评估函数(而不是其梯度).数值梯度为昂贵. 还要注意,所有这些方法都会收敛到本地最小值,因此它们对您最初启动优化器的点相当敏感.全球优化是完全不同的野兽. 作为最终想法,您几乎可以找到最小
14 2023-11-23
编程技术问答社区
在gnuplot上有u和v成分的向量场
我正在求解通道方程,以使不可压缩的流体流穿过有障碍物的正方形区域.作为输出,我将X和Y的速度组件作为NxN矩阵.如何在gnuplot中绘制矢量字段. 我找到了这个答案,但我不明白. 任何人都可以解释如何使用我的输出来绘制向量字段? 更新 我尝试按照@lutzl所说的那样做,但是我的代码似乎有些问题.此代码一切都还好吗? int main() { ifstream finu("U"), finv("V"); int N = 41, M = 41; auto **u = new double *[N], **v = new double *[N]; for (int i = 0; i
6 2023-11-17
编程技术问答社区
gnuplot 矢量箭头长度和流线
我已经有问 在这里.现在,我想了解更多. 我该如何做到,以使每个箭头具有相同的固定长度并按颜色定义值的大小? ,是否仍然不可能在gnuplot中绘制流线?如果可能,我该怎么做? 现在我有这个,需要升级它. set term pngcairo set title 'Navier-Stokes Equation' set terminal png size 1280,720 set output 'vec.png' plot 'vec' u 1:2:($3/$5):($4/$5) w vec t 'Vector Field' 更新 感谢@theozh我得到了我想要的东西.我想分享我的结果,因为这对别人可能很有用. 现在,我使用这些说明来绘制我的向量字段. reset session set size square set palette rgb 33, 15, 10 set term pngcairo set title 'Navier-Stokes
8 2023-11-17
编程技术问答社区