小编jvr*_*sem的帖子

在MATLAB中计算数值导数的最佳方法是什么?

(注意:这是一个社区Wiki.)

假设我有一组点xi = { x0,x1,x2,... xn }和相应的函数值fi = f(xi)= { f0,f1,f2,...,fn },其中f(x),一般来说,是一个未知的功能.(在某些情况下,我们可能提前知道f(x),但我们想要这样做,因为我们通常提前知道f(x).)什么是近似f的导数的好方法(x)在每个点xi也就是说,如何在每个点xi处估计dfi == d/d x fi == d f(xi)/ d x的值?

不幸的是,MATLAB没有一个非常好的通用数值微分程序.造成这种情况的部分原因可能是因为选择一个好的例程可能很困难!

那有什么样的方法呢?有哪些例程?我们如何为特定问题选择一个好的例行程序?

在选择如何区分MATLAB时,有几个注意事项:

  1. 你有一个象征性的功能或一组点吗?
  2. 你的网格是均匀的还是不均匀的?
  3. 您的域名是定期的吗?你能假设周期性边界条件吗?
  4. 您在寻找什么样的准确度?您是否需要在给定的容差范围内计算导数?
  5. 您的衍生产品是否与您定义的函数在相同的点上进行评估,这对您来说是否重要?
  6. 你需要计算多个衍生品订单吗?

什么是最好的方法?

matlab numerical-methods derivative differentiation

17
推荐指数
1
解决办法
2万
查看次数

如何像MATLAB一样调用UMFPACK?

问题

我希望解决一般的线性方程组A*x = b.m-by-m矩阵是稀疏的,实数,正方形,条件稍差,非对称,但它是奇异的(秩(A)== m-1),因为x只知道一个加性常数.

我可以通过在三个矢量(指定其非零项创建矩阵A i,jv),使得A(i(k),j(k)) = v(k):

A = sparse( i, j, v, m, m );
Run Code Online (Sandbox Code Playgroud)

原始方程

我可以解决这个原始方程如下:

x = A \ b;
Run Code Online (Sandbox Code Playgroud)

如果我想要一个独特的解决方案,我可以在计算非唯一解决方案后施加一个约束(比如,x(4)== 3.14159):

x = x - x(4) + 3.14159;
Run Code Online (Sandbox Code Playgroud)

修正方程

我可以C通过添加一个额外的唯一性约束来创建一个新的全秩矩阵,如下所示:

% Add the constraint x(4) == 3.14159
extraRow = zeros(1,m);
extraRow(4) = 1.0;
C = [A; extraRow];    % Add to the matrix A
d = [b; 3.14159];     % Add to the RHS vector, …
Run Code Online (Sandbox Code Playgroud)

matlab fortran sparse-matrix numerical-methods suitesparse

15
推荐指数
1
解决办法
954
查看次数

如何在F90中编写to_upper()或to_lower()函数?

如何写一个(英特尔)F90函数将字符串转换为小写(或者,大写)?我想将一个字符数组传递给函数并让它返回一个字符数组,例如

program main
    implicit none

    character*32 :: origStr = "Hello, World!"
    character*32 :: newStr

    newStr = to_lower(origStr)
    write (*,*) newStr

end program main
Run Code Online (Sandbox Code Playgroud)

这样程序输出hello, world!.

我一直to_lower()RosettaCode中找到的子程序开始,但我无法弄清楚如何将其作为函数编写.

提前致谢!

PS - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!

string fortran function

10
推荐指数
3
解决办法
1万
查看次数

STOP和ERROR STOP之间有什么区别?

Fortran有,stop并且error stop都过早地退出程序并且可以返回错误代码.

这两者之间有什么区别,什么时候应该使用?(另外,这里有实现/编译器问题吗?)

我从英特尔的文档中了解到stop终止程序,但error stop似乎做了一些.那个页面很有用,但并不能完全回答我的问题,因为1)它对我来说有点太技术了,2)我知道Fortran标准在实现中为"艺术表达"留下了空间,所以我不这样做相信该页面能够完美地反映标准.

我注意到这个问题与Fortran中"stop"和"exit"之间的区别有什么关系?- 事实上,我的问题是受到这个问题答案的启发.而这个问题问的区别stopexit,我专门在看的基本事实的差异stoperror stop.回想起来,我的问题在这个问题上是一个有用的补充,但由于事实并非如此,这是一个单独的问题.

fortran

6
推荐指数
2
解决办法
859
查看次数

在 Fortran 中完全表达双精度值的可移植格式是什么?

假设我希望以可移植的方式将一个双精度值写入 ASCII 文件,使其达到全精度。(显然,原始二进制输出是表达数字的最紧凑的方式,但这不是我在这里要问的。)

我想要另一个程序,例如用 MATLAB 或 Python 编写,能够读取文件并存储与 Fortran 程序内部相同的确切值。

默认的 ASCII 输出简单地完成如下:

program main
   use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT
   implicit none

   real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp

   write(stdout,*) pi            ! Test the default format 
   write(stdout,'(f)') pi        ! Test the specific decimal default format
   write(stdout,'(f20.15)') pi   ! Probably sufficient precision...
   write(stdout,'(f30.20)') pi   ! EXCESSIVE PRECISION!

end program main
Run Code Online (Sandbox Code Playgroud)

我知道不同的编译器可能有不同的格式默认值和要求。例如,ifort编译上面的例子没有问题,并产生以下输出:

   3.14159265358979
       3.1415926535897931
   3.141592653589793
        3.14159265358979311600
Run Code Online (Sandbox Code Playgroud)

gfortran(gcc version 4.8.2) 另一方面,第二个输出语句需要一个宽度,所以编译失败。注释掉第二个输出语句'(f)'允许编译,结果(此处添加空行)为:

   3.1415926535897931

   3.141592653589793
        3.14159265358979311600
Run Code Online (Sandbox Code Playgroud)

我无法访问nagfor …

precision formatting portability ascii fortran

6
推荐指数
1
解决办法
1021
查看次数

ifort何时使用优化标志?

介绍

据我所知,英特尔的Fortran编译器ifort执行一些函数内联和过程间优化(IPO)以及其他标准优化.这可以在以下示例中完成:

ifort -O2 -finline-functions -ipo myProgram.f function.f subroutine.f -o MyProgram
Run Code Online (Sandbox Code Playgroud)

编译器选项说明:

  • -O2标志告诉编译器执行重要的优化(对于Fortran,包括函数内联).
  • -finline-functions标志告诉编译器允许函数内联.(这是默认行为;为了显而易见,我在这里包含了标志.)
  • -ipo标志告诉编译器执行IPO.

假设我将编译过程分解为两个步骤,就像使用Makefile时经常做的那样....

步骤1

我分别编译汇编一堆文件,将源代码转换为目标文件:

ifort -O2 -ipo -c   function.f -o   function.o
ifort -O2 -ipo -c subroutine.f -o subroutine.o
ifort -O2 -ipo -c  myProgram.f -o  myProgram.o
Run Code Online (Sandbox Code Playgroud)

(我猜这个步骤没有完成内联,因为文件是独立编译的....)

第2步

然后我将目标文件链接在一起并创建可执行文件:

  • ifort -O2 -finline-functions -ipo myProgram.o function.o subroutine.o -o MyProgram

我的问题

如果我单独编译的文件,这些优化标志的应传递给在阶段该编译器?在哪一步内联和IPO执行?

optimization fortran makefile compilation intel-fortran

5
推荐指数
1
解决办法
507
查看次数

如何将(r,球谐)空间中表示的数据插值到规则的笛卡尔网格(F90)?

我正在尝试将球谐函数插值到立方笛卡尔网格。

我的球面伪光谱模拟的输出数据的Nr径向水平介于rMin和之间rMax,每个水平包含一组经度和纬度的有限阶球谐函数。球谐函数通过三角截断映射到包含Ni经度和纬度的物理球面网格Nj

域如下:

  • 径向水平:rMin <= r(k) <= rMax,带有索引1 <= k <= Nr
  • 球谐函数(三角截断,不产生变换混叠):
    • Nm = (Nj-1)/3
    • 0 <= m <= Nm
    • m <= l <= Nm
    • nlm == (nm+1)*(nm+2)/2(的总数lm组合)

数据数组:

  • 光谱形式: complex*16, dimension( 1:nlm, 1:Nr ) :: foo_spectral
  • 笛卡尔形式: real*8, dimension( 1:Nx, 1:Ny, 1:Nz ) :: foo_cartesian

我正在寻找一种准确,有效的方法,将数据从其频谱表示形式插值到具有边长的立方笛卡尔网格中2*rMax,以使球形域完全适合内部。但是,我只想在球体内进行插值:对于与r<rMin或对应的点rMax<r,三次方网格应具有OUTSIDE_DOMAIN值。

目前,我必须将数据从其频谱表示形式(球面谐波:)foo(Nr,nlm)转换为物理表示形式(球面网格 …

interpolation fortran representation spectral qhull

4
推荐指数
1
解决办法
716
查看次数

BASH:有没有办法在不活动期间自动将最近的行保存到我的bash历史记录中?

.bash_history文件是我们许多人的生命保存.不幸的是,BASH似乎只在该会话关闭(通过exit)时保存会话的命令.

这是一个悲剧,然后,当一个重要会话的所有命令在一个会话意外关闭时被蒸发 - 在它使用花哨的语法归档所有命令之前需要数小时才能正确...

当我忘记在离开工作时忘记关闭SSH连接,并且由于不活动(Write failed: broken pipe)而导致断开连接,或者当我重新启动计算机而没有手动关闭终端时,这种情况发生在我身上,等等.

我希望在一段时间之后将我的BASH命令存档 - 比如说每10分钟 - 这样如果我关闭一个会话,我的命令仍然会存在.这似乎是很多人可能觉得有用的东西.

有没有人知道如何做到这一点?

理想的情况下....

  • 一旦设置,该功能就不需要用户的额外努力 - 他/她可以添加的东西 ~/.bashrc
  • 用户可以更改备份间隔
  • 它会避免使用临时文件,别名bash或其他"黑客"

StackOverflow- ers - 认为自己受到挑战!

bash shell scripting history .bash-profile

3
推荐指数
1
解决办法
1159
查看次数

在Fortran-90中将参数作为参数传递?

假设我有一个子程序:

subroutine foo(x, Nx)
    implicit none
    integer, intent(IN) :: x
    integer, intent(IN) :: Nx

    select case(x)
        case (1)
            write(*,*) "Minimum value"
        case (Nx)
            write(*,*) "Maximum value"
        case default
            write(*,*) "Somewhere in-between"
    end select
end subroutine foo
Run Code Online (Sandbox Code Playgroud)

假设我的驱动程序看起来像这样:

program main
    implicit none

    interface
        subroutine foo(x,Nx)
            integer, intent(IN)  :: x
            integer, intent(IN)  :: Nx
        end subroutine foo
    end interface

    integer, parameter :: Nx = 100
    integer :: x

    call foo(20, Nx)

end program main
Run Code Online (Sandbox Code Playgroud)

以上程序不会编译,因为在子程序中,case (Nx)无效.具体来说,ifort 16给出以下错误:

错误#6601:在CASE语句中,case-value必须是常量表达式.

换句话说,即使Nx被有效地 …

parameters fortran fortran90 select-case intel-fortran

3
推荐指数
1
解决办法
764
查看次数

Fortran 2003 中的内在赋值和多态性

我尝试向此模块添加一个由@VladimirF编写的过程,该过程在 Fortran 2003 中实现通用链表。为了方便起见,我希望能够将列表的内容作为数组输出,因此我将以下过程添加到列出名为的文件中的模块lists.f90

  subroutine list_as_array(self, arrayOut)
    class(list),intent(inout) :: self
    class(*),dimension(1:self%length),intent(out) :: arrayOut
    integer :: i
    type(list_node), pointer :: nodeIter
    nodeIter = self%first
    do i = 1,self%length
      arrayOut(i) = nodeIter%item  ! <---ERROR here
      if (i<self%length) then
        nodeIter = nodeIter%next
      end if
    end do
  end subroutine list_as_array
Run Code Online (Sandbox Code Playgroud)

ifort 18.0.0给出以下错误:

lists.f90(324): error #8304: In an intrinsic assignment statement, variable shall not be a non-allocatable polymorphic.   [ARRAYOUT]
      arrayOut(i) = nodeIter%item
------^
Run Code Online (Sandbox Code Playgroud)

我对 F2003+ 中的多态性不熟悉,所以我不理解错误消息或其上下文。出了什么问题,如何修复?

polymorphism fortran intel-fortran

3
推荐指数
1
解决办法
1093
查看次数